2012-04-04 2 views
4

Html.ValidationSummary (true) 태그가있는 면도기 뷰가 있습니다.Html.ValidationSummary (true)에 유효하지 않은 오류가 표시되지 않습니다.

속성 수준 유효성 검사가 제대로 실행되고 오류가있는 필드 옆에 메시지가 표시됩니다. 그러나 IValidatable 구현 Validate 메서드에 의해 유효성 검사에 대한 문제가 있습니다.

모델 자체는 그러나 뷰 모델은 복잡한에 대한 참조를 포함하는 경우 IValidatable 다음 오류가 modelstate에 추가 올바르게 Html.ValidationSummary (참) 태그 (모델 수준의 오류가 아닙니다 속성 레벨)에 표시됩니다 구현하는 경우

객체 ([필수] 주석으로 장식 됨) 메시지가 표시되지 않습니다. 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."); 
     } 
    } 
} 

면도기보기 :

@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); }); 
       }     
      } 
관련 문제