2012-04-04 25 views
4

我有一個Html.ValidationSummary(true)標記的剃刀視圖。Html.ValidationSummary(true)不顯示Ivalidatable錯誤

屬性級驗證執行正常,消息顯示在錯誤字段旁邊。然而,對於通過Validate方法實現IValidatable的驗證,我有一個問題。

如果模型本身實現IValidatable則錯誤被添加到的ModelState和正確地在Html.ValidationSummary(真)標籤(型號水平誤差不屬性電平)顯示 IF然而視圖模型包含對複雜的參照對象(用[必填]註釋裝飾),則不顯示消息。它被添加到ModelState中並且isValid正確地變爲false。它在錯誤和顯示列表中是一個模型級錯誤但是不顯示。 (如果使用Html.ValidationSummary(false),則顯示消息)。

這只是不可行嗎?難道我做錯了什麼?唧唧歪歪移動到流利,但再次是更多的工作....

下面是代碼示例: 視圖模型:

public class ViewModel 
{ 
    [Required] 
    public TestModel DataModel { get; set; } 
} 

TestModel:

public class TestModel : IValidatableObject 
{ 

    [Display(ResourceType = typeof(ViewResources), Name = "Field1")] 
    public string Field1 { get; set; } 
    public string Field2 { get; set; } 

    [Required] 
    public string Field3 { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 

     if (string.IsNullOrEmpty(Field1) && string.IsNullOrEmpty(Field2)) 
     { 
      yield return new ValidationResult("Need to enter either Field1 or Field2."); 
     } 
    } 
} 

Razor視圖:

@using (Ajax.BeginForm(new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "createDialog" })) 
{ 
    @Html.ValidationSummary(true) 

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

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

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

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

控制器:

if (!ModelState.IsValid) return View(); 
    return View(); 

回答

0

不是一個乾淨的實現,但你仍然可以使用它。

if (!ModelState.IsValid) 
      { 
       System.Web.Mvc.ModelState modelStateObj = new ModelState(); 
       bool isModelStateAvailable = ModelState.TryGetValue("DataModel", out modelStateObj); 
       if (isModelStateAvailable) 
       { 
        ModelState.Remove("DataModel"); 
        modelStateObj.Errors.ToList().ForEach(t => { ModelState.AddModelError(string.Empty, t.ErrorMessage); }); 
       }     
      }