2012-05-09 33 views
4

我有一個簡單的MVC網站,顯示用於編輯目的的jQuery對話框。在這個對話框中是一個textarea,它接受用戶可以輸入的以逗號分隔的技能列表。提交後,我的模型綁定器將其變爲列表。這裏是粘合劑.NET MVC不引人注意的驗證和自定義模型綁定器

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(); 
      } 


     } 

    } 

我的模型的代碼,這是我的部分觀點

@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> 

所有我簡單的驗證,如[必填]作爲在客戶端使用的代碼。模型聯編程序驗證也起作用,但是,錯誤消息未顯示。我假設我錯過了一些JavaScript的註冊錯誤,但我不知道它是什麼。任何幫助,將不勝感激。謝謝。

這是問題的一個屏幕截圖

enter image description here

回答

2

所以我拋棄了不顯眼的,什麼我發現了,我對我的模型[必需]屬性爲這是導致驗證的技巧截圖,而不是來自我的模型綁定器的驗證。

儘管模型綁定器並非用於驗證,但似乎嘗試爲同一模型屬性混合驗證屬性和模型綁定器會導致問題(至少在我嘗試將字符串轉換爲列表的情況下),因此,我在我的模型綁定器(它提供了額外的功能)中嚴格驗證,並且它已經開始工作。

編輯

我要補充的是我放棄了贊成每this post FluentValidation屬性驗證。它不那麼冗長,與客戶端驗證集成在一起,並且更易於使用。