2012-05-09 4 views
4

J'ai un simple site Web MVC qui affiche une boîte de dialogue jquery à des fins d'édition. Dans cette boîte de dialogue se trouve une zone de texte qui accepte une liste de compétences délimitées par des virgules que l'utilisateur peut saisir. Lors de la soumission, ma reliure modèle transforme cela en Liste. Voici le code pour mon modèle liant.NET MVC validation discrète et classeur de modèle personnalisé

public class EditSkillsModelBinder : DefaultModelBinder 
    { 
     protected override void OnModelUpdated(ControllerContext controllerContext, 
     ModelBindingContext bindingContext) 
     { 
      var form = controllerContext.HttpContext.Request.Form; 
      var skillsAsString = form["SkillsAsString"]; 
      var user = bindingContext.Model as UserEditDetailsModel; 

      //FOR VALIDATION 
      ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
      ModelState modelState = new ModelState {Value = valueResult}; 

      if (string.IsNullOrEmpty(skillsAsString)) 
      { 
       bindingContext.ModelState.AddModelError("Skills", "You must enter at least one skill."); 
      } 
      else 
      { 
       user.Skills = string.IsNullOrEmpty(skillsAsString) ? new List<string>() : skillsAsString.Split(',').Select(i => i.Trim()).ToList(); 
      } 


     } 

    } 

Et voici le code de mon point de vue partielle

@using (Ajax.BeginForm("EditUserDetails", new { }, new AjaxOptions { }, new { id = "EditUserDetailsForm" })) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>UserEditDetailsModel</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.FirstName) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.FirstName) 
      @Html.ValidationMessageFor(model => model.FirstName) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.LastName) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.LastName) 
      @Html.ValidationMessageFor(model => model.LastName) 
     </div> 


     <div class="editor-label"> 
      @Html.LabelFor(model => model.Skills) 
     </div> 
     <div class="editor-field"> 
      @Html.TextArea("SkillsAsString", Model.Skills.ToCommaSeparatedString()) 
      @Html.ValidationMessageFor(model => model.Skills) 
     </div> 


     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 


} 


@*Enable Client Side Validation*@ 
<script type="text/javascript"> 
    $(document).ready(function() { 
     $.validator.unobtrusive.parse("#content_container > form"); 
    }); 
    </script> 

Tous mes simples tels que des validations [Obligatoire] en travaillant sur le côté client. La validation du classeur fonctionne également, mais le message d'erreur n'est pas affiché. Je suppose qu'il me manque quelque chose dans le javascript pour enregistrer l'erreur mais je ne peux pas comprendre ce que c'est. Toute aide serait appréciée. Merci.

Voici une capture d'écran du problème

enter image description here

Répondre

2

J'abandonné le discret et ce que j'ai trouvé que j'avais un attribut [Obligatoire] sur mon modèle de compétences qui a été à l'origine de la validation dans le capture d'écran, pas la validation de mon classeur modèle. Bien que les classeurs de modèle ne soient pas destinés à la validation, il semble que tenter de mélanger des attributs de validation et des classeurs de modèle pour la même propriété de modèle entraînera des problèmes (au moins dans mon cas de conversion d'une chaîne en liste). Je valide strictement dans mon classeur modèle (qui fournit des fonctionnalités supplémentaires) et il a commencé à fonctionner.

EDIT

Je dois ajouter que je laissai tomber d'attributs de validation en faveur de FluentValidation par this post. Il est beaucoup moins verbeux, s'intègre à la validation du client et est plus facile à utiliser.

Questions connexes