为什么验证不能使用Html.TextBoxFor,但是在使用Html.EditorFor时是什么?

时间:2015-06-23 11:53:48

标签: asp.net-mvc unobtrusive-validation html.textboxfor asp.net-mvc-helpers

我正在尝试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)。

虽然像this这样的帖子在处理Html.TextBoxFor和Html.EditorFor之间的差异方面做得很好,但我找不到为什么验证数据类型EmailAddress 的答案使用 TextBoxFor 时不起作用。我确实发现人们提到TextBoxFor并没有考虑元数据,而EditorFor则考虑到了。

但这有意义吗?那么TextBoxFor不支持客户端验证?!

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

1 个答案:

答案 0 :(得分:3)

TextBoxFor()可以使用验证。

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

生成和输入

如果您想要验证电子邮件地址,请使用您商家的[EmailAddress]属性。

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

修改(继续评论)

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

  

电子邮件:该元素代表一个电子邮件地址。换行符会自动从输入值中删除。可以设置无效的电子邮件地址,但是如果电子邮件地址满足ABNF生产1 *(atext /&#34;。&#34;)&#34; @&#34;则输入字段将仅满足其约束。 ldh-str 1 *(&#34;。&#34; 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本人this answer

  

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