1

我正在尝试 MVC 的数据类型属性,并创建了一个简单的场景,如下所示:

观点:_

@model MVC4.Models.Model

@{
    ViewBag.Title = "DataTypeAttribute";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

<h2>DataTypeAttribute</h2>


@using (Html.BeginForm("SubmitData", "Home"))
{
    <div>
        @Html.ValidationSummary()
    </div>

    @Html.EditorFor(m => m.Email)
    <br />
    <br />
    @Html.EditorFor(m => m.PostalCode)

    <br />
    <br />
    @Html.EditorFor(m => m.TextOnly)
    <br />
    <br />

    <button type="submit">Submit</button>
}

型号:_

public class Model
{
    [DataType(DataType.EmailAddress)]

    [Required]
    //[EmailAddress]
    public string Email { get; set; }

    [DataType(DataType.PostalCode)]
    public string PostalCode { get; set; }


    public string TextOnly { get; set; }
}

“SubmitData”只是一个控制器,如果 ModelState.IsValid 为 false,则返回 View(..., model)。

尽管这样的帖子解决 Html.TextBoxFor 和 Html.EditorFor 之间的差异方面做得很好,但我找不到关于为什么使用TextBoxFor时对数据类型 EmailAddress的验证不起作用的答案。我确实发现提到 TextBoxFor 的人没有考虑元数据,而 EditorFor 则考虑了元数据。

但这有意义吗?所以 TextBoxFor 不提供对客户端验证的支持?!

我想知道两者之间差异的原因是什么?

4

1 回答 1

3

TextBoxFor()确实适用于验证。

[DataType(DataType.EmailAddress)]不是验证属性。type它是一个属性,通过在呈现的 html 中设置属性来确定要显示的输入类型。例如<input type="text" ..>,为了呈现 HTML4 日期选择器、电子邮件输入等的浏览器实现。它仅适用于<input type="date" ..>因为顾名思义生成和输入<input type="email" ..>EditorFor()TextBoxFor()type="text"

如果您想验证电子邮件地址,则使用[EmailAddress]属性上的属性。

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

编辑(进一步的评论)

HTML5 的特性之一是能够在不依赖脚本的情况下验证用户数据。一种这样的浏览器验证形式是使用type属性。对通过添加到元素[DataType(DataType.EmailAddress)]的属性呈现的属性的使用。来自MDN 文档@Html.EditorFor()type="email"input

email:该元素代表一个电子邮件地址。换行符会自动从输入值中去除。可以设置无效的电子邮件地址,但只有当电子邮件地址满足 ABNF 产生式时,输入字段才会满足其约束 1*( atext / "." ) "@" ldh-str 1*( "." ldh-str )其中 atext 在 RFC 5322 第 3.2.3 节中定义,ldh-str 在 RFC 1034 第 3.5 节中定义。

如果您当前看到与该属性关联的验证错误消息,并且您尚未添加该[EmailAddress]属性,那么这意味着该属性jquery.validate.js未加载并且您看到与type="email".

jquery.validate.js被加载(正确)时,该novalidate="novalidate"属性被添加到form元素中,该属性指定表单在提交时不被验证(使用 HTML5 验证)。相关代码jquery.validate.js是(大约第 35 行)

// Add novalidate tag if HTML5.
this.attr('novalidate', 'novalidate');

添加此功能是为了防止浏览器验证显示的错误消息和 jquery 不显眼的验证之间可能出现的混淆。

至于为什么 DataTypeAttribute属性在实际不进行验证时会继承 ValidationAttribute,来自 Brad Wilson 本人在这个答案中

它派生自 ValidationAttribute 的原因是,您可以创建一个新的自定义数据类型类,它既是 DataType 又是 Validation,它们都封装为一个。这是 .NET 不允许多重继承的一个不幸的副作用。

于 2015-06-23T12:01:02.607 回答