2012-04-13 4 views
1

de validation personnalisé simple,MVC3 simple, validation personnalisée

ma validation du modèle et personnalisé:

public class Registration 
{ 
    [Required(ErrorMessage = "Date of Birth is required")]   
    [AgeV(18,ErrorMessage="You are not old enough to register")] 
    public DateTime DateOfBirth { set; get; } 
} 

public class AgeVAttribute : ValidationAttribute 
{ 
    private int _maxAge; 

    public AgeVAttribute(int maxAge) 
    { 
     _maxAge = maxAge; 
    } 

    public override bool IsValid(object value) 
    { 
     return false;  <--- **this never gets executed.... what am I missing?** 
    } 
} 

(S'il vous plaît voir le commentaire en ligne ci-dessus)

Vue:

@using (Html.BeginForm()) { 
@Html.ValidationSummary("Errors") 
<fieldset> 
    <legend>Registration</legend> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.DateOfBirth) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.DateOfBirth)  
    </div> 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 
+1

À quoi ressemble votre contrôleur qui reçoit le modèle? –

+1

J'ai essayé votre code dans un projet MVC vide et l'appel à IsValid se déroule comme il se doit. – Iridio

+0

Souhaitez-vous fournir la méthode 'action' où le modèle de type 'Registration' est utilisé? J'ai testé votre code, il fonctionne du côté serveur. Comme votre 'AgeVAttribute' n'implémente pas IClientValidatable, la validation côté client est désactivée. – Kibria

Répondre

2

Can Repro.

Modèle:

public class Registration 
{ 
    [Required(ErrorMessage = "Date of Birth is required")] 
    [AgeV(18, ErrorMessage = "You are not old enough to register")] 
    public DateTime DateOfBirth { set; get; } 
} 

public class AgeVAttribute : ValidationAttribute 
{ 
    private int _maxAge; 

    public AgeVAttribute(int maxAge) 
    { 
     _maxAge = maxAge; 
    } 

    public override bool IsValid(object value) 
    { 
     return false; 
    } 
} 

Controller:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new Registration 
     { 
      DateOfBirth = DateTime.Now.AddYears(-10) 
     }); 
    } 

    [HttpPost] 
    public ActionResult Index(Registration model) 
    { 
     return View(model); 
    } 
} 

Vue:

@model Registration 

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary("Errors") 
    <fieldset> 
     <legend>Registration</legend> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.DateOfBirth) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.DateOfBirth)  
     </div> 
     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

La méthode IsValid est toujours frappé lorsque le formulaire est soumis. Notez également que je n'ai pas activé la validation côté client car je n'ai pas inclus les scripts jquery.validate.js et jquery.validate.unobtrusive.js. Si vous les avez inclus et qu'il y a une erreur, il est probable que la validation côté client empêchera que votre formulaire soit même envoyé au serveur, auquel cas il serait normal que la méthode IsValid ne soit pas invoquée.

+0

thx Darin, une fois que j'ai placé [HttpPost] public ActionResult Index (modèle d'enregistrement) { return Vue (modèle); } la méthode IsValid a été exécutée. Si ce n'est pas difficile, pourriez-vous me montrer comment faire la vérification en utilisant la validation côté client, au lieu de faire des remerciements sur le serveur pour votre aide – Ben

+0

Vous pouvez avoir votre attribut de validation personnalisé implémenter l'interface 'IClientValidatable', puis enregistrer un adaptateur personnalisé ce qui représentera une fonction javascript que vous devez écrire et répliquer la même logique de validation que vous avez sur le serveur. Voici un exemple: http://stackoverflow.com/a/4747466/29407 –

+0

Salut Darin, j'ai vérifié l'exemple que vous avez posté, tout est clair jusqu'à ce que j'arrive à la dernière partie (définissez l'adaptateur personnalisé) pourriez-vous s'il vous plaît me montrer comment voulez-vous mettre en œuvre la restriction d'âge (adaptateur personnalisé), je regarde l'exemple que je vois méthode. test(), pas sûr de ce qui se passe .. si vous pouviez m'expliquer ce serait génial merci encore une fois. – Ben