4

Html.ValidationSummary(true) タグを持つ Razor ビューがあります。

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

モデル自体が IValidatable を実装している場合、エラーがモデル状態に追加され、Html.ValidationSummary(true) タグに正しく表示されます (プロパティ レベルではなくモデル レベルのエラー) IF ただし、ビュー モデルに複雑なオブジェクトへの参照が含まれている ([ で装飾されている) Required] 注釈) の場合、メッセージは表示されません。ModelState に追加され、isValid が正しく false になります。エラーのリストにあり、モデル レベルのエラーとして表示されますが、表示されません。(Html.ValidationSummary(false) を使用すると、メッセージが表示されます)。

これは実行できないだけですか?私は何か間違ったことをしていますか?Fluentへの移行について議論していますが、それはまた仕事です....

コードの例を次に示します。 モデルの表示:

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

テストモデル:

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

1 に答える 1

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); });
                }                
            }
于 2012-04-17T10:12:00.423 に答える