2012-04-04 36 views
4

私はHtml.ValidationSummary(true)タグを持つRazorビューを持っています。Html.ValidationSummary(true)に無効なエラーが表示されない

プロパティレベルの検証が正常に実行されていて、エラーのあるフィールドの横にメッセージが表示されます。しかし、IValidatableを実装しているValidateメソッドによる検証では、問題があります。

モデル自体がエラーにModelStateに添加し、正しくHtml.ValidationSummary(真)タグ(モデルレベルのエラーではないプロパティレベル)に表示され、その後IValidatableを実装している場合 ビューモデルが複雑への参照が含ましかし、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."); 
     } 
    } 
} 

カミソリビュー:

@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); }); 
       }     
      } 
関連する問題