【问题标题】:IValidatableObject.Validate does not fire if DataAnnoations add ValidationResult如果 DataAnnoations 添加 ValidationResult,IValidatableObject.Validate 不会触发
【发布时间】:2013-12-23 05:44:46
【问题描述】:

使用标准的 ASP.NET MVC 控制器和视图以及既实现 IValidatableObject 并具有 DataAnnotations 的模型,如果 DataAnnotations 生成异常,Validate 方法将永远不会触发。

这是模型...

public class ModelStaticDA : IValidatableObject {
    public long Id { get; set; }

    [EmailAddress]
    public string EmailAddress { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
        yield return new ValidationResult("MODEL NOT VALID!")
    }  
}

这是视图(此演示禁用客户端验证)...

@model BindingAndValidation.Models.ModelStaticDA
@{
    ViewBag.Title = "Create";
    HtmlHelper.ClientValidationEnabled = false;
}
<h2>Create</h2>
@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>ModelStaticDA</h4>
        <hr />
        @Html.ValidationSummary(true)

        <div class="form-group">
            @Html.LabelFor(model => model.EmailAddress, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.TextBoxFor(model => model.EmailAddress)
                @Html.ValidationMessageFor(model => model.EmailAddress)
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

如果您向 EmailAddress 发布类似“无效”的内容,则只会显示 DataAnnotation 消息。如果您发布有效的电子邮件地址,则会显示来自 Validate 的消息。

这是正确的行为吗?如果是这样,为什么?如果没有,我做错了什么?

【问题讨论】:

    标签: asp.net-mvc validation asp.net-mvc-5


    【解决方案1】:

    你做的一切都是对的,这就是行为。我猜它是这样设计的,以避免在使用 Validate 方法中的属性时必须再次验证,你知道当它被调用时你正在使用有效数据,并且你可以做需要有效数据的事情。

    【讨论】:

    • 谢谢马克斯。你说的有道理,但我有点希望我错了。
    猜你喜欢
    • 2011-11-06
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    相关资源
    最近更新 更多