【问题标题】:Html.ValidationSummary(true) does not display Ivalidatable errorsHtml.ValidationSummary(true) 不显示可验证错误
【发布时间】:2012-04-18 11:40:06
【问题描述】:

我有一个带有 Html.ValidationSummary(true) 标记的 Razor 视图。

属性级别验证执行良好,消息显示在错误字段旁边。但是,对于通过实现 IValidatable 的 Validate 方法进行的验证,我有一个问题。

如果模型本身实现了 IValidatable 则错误被添加到模型状态并正确显示在 Html.ValidationSummary(true) 标记处(模型级别错误不是属性级别) 但是,如果视图模型包含对复杂对象的引用(用 [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();

【问题讨论】:

    标签: asp.net-mvc-3 data-annotations


    【解决方案1】:

    不是一个干净的实现,但你仍然可以使用它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多