Asp.net mvc 电子邮件地址客户端的MVC5验证

Asp.net mvc 电子邮件地址客户端的MVC5验证,asp.net-mvc,validation,Asp.net Mvc,Validation,我的模型中有以下属性: [Required(ErrorMessage = "{0} is a required field.")] [StringLength(150, ErrorMessage = "There are too many characters in this field.")] [DataType(DataType.EmailAddress)] [EmailAddress] [MaxLength(150, ErrorMessage = "Maximum of 150 chara

我的模型中有以下属性:

[Required(ErrorMessage = "{0} is a required field.")]
[StringLength(150, ErrorMessage = "There are too many characters in this field.")]
[DataType(DataType.EmailAddress)]
[EmailAddress]
[MaxLength(150, ErrorMessage = "Maximum of 150 characters allowed.")]
[Display(Name = "Customer budget owner")]
public string CustomerBudgetOwner { get; set; }
所有属性都是microsoft的内置属性。 视图中的html如下所示:

 <div class="form-group">
  @Html.LabelFor(m => m.HardwareRequest.CustomerBudgetOwner, htmlAttributes: new { @class = "form-label" })
  <div class="input-group">
    <div class="input-group-addon input-group-sm">
      <span>@@</span>
    </div>
    @Html.TextBoxFor(m => m.HardwareRequest.CustomerBudgetOwner, htmlAttributes: new { @class = "form-control input-sm", id = "txtCustomerBudgetOwner" })
    <div class="input-group-addon">
      <span id="btnCustomerBudgetOwnerInfo" class="glyphicon glyphicon-info-sign info-icon" data-toggle="popover" data-placement="right" data-content="Enter the email address of the budget owner."></span>
    </div>
  </div>
  @Html.ValidationMessageFor(m => m.HardwareRequest.CustomerBudgetOwner, "", new { @class = "text-danger" })
</div>
<input class="form-control input-sm valid" data-val="true" data-val-email="The Customer budget owner field is not a valid e-mail address." data-val-length="There are too many characters in this field." data-val-length-max="150" data-val-maxlength="Maximum of 150 characters allowed." data-val-maxlength-max="150" data-val-required="Customer budget owner is a required field." id="txtCustomerBudgetOwner" name="HardwareRequest.CustomerBudgetOwner" type="text" value="" aria-required="true" aria-invalid="false" aria-describedby="txtCustomerBudgetOwner-error">

@LabelFor(m=>m.HardwareRequest.CustomerBudgetOwner,htmlAttributes:new{@class=“form label”})
@@
@TextBoxFor(m=>m.HardwareRequest.CustomerBudgetOwner,htmlAttributes:new{@class=“form control input sm”,id=“txtCustomerBudgetOwner”})
@Html.ValidationMessageFor(m=>m.HardwareRequest.CustomerBudgetOwner,“,新{@class=“text danger”})
如果我只输入几个字符而不是@字符,则会显示验证错误消息

如果我输入类似aaaa@bbbbb.ccc没有错误,因为它看起来像电子邮件地址

如果我输入类似aaaa@bbbbb未显示任何客户端错误,但在控制器中,modelstate无效

我是否在模型验证属性中出错? 还是我无法控制的事情

[编辑] 删除DataType属性后,生成的HTML如下所示:

 <div class="form-group">
  @Html.LabelFor(m => m.HardwareRequest.CustomerBudgetOwner, htmlAttributes: new { @class = "form-label" })
  <div class="input-group">
    <div class="input-group-addon input-group-sm">
      <span>@@</span>
    </div>
    @Html.TextBoxFor(m => m.HardwareRequest.CustomerBudgetOwner, htmlAttributes: new { @class = "form-control input-sm", id = "txtCustomerBudgetOwner" })
    <div class="input-group-addon">
      <span id="btnCustomerBudgetOwnerInfo" class="glyphicon glyphicon-info-sign info-icon" data-toggle="popover" data-placement="right" data-content="Enter the email address of the budget owner."></span>
    </div>
  </div>
  @Html.ValidationMessageFor(m => m.HardwareRequest.CustomerBudgetOwner, "", new { @class = "text-danger" })
</div>
<input class="form-control input-sm valid" data-val="true" data-val-email="The Customer budget owner field is not a valid e-mail address." data-val-length="There are too many characters in this field." data-val-length-max="150" data-val-maxlength="Maximum of 150 characters allowed." data-val-maxlength-max="150" data-val-required="Customer budget owner is a required field." id="txtCustomerBudgetOwner" name="HardwareRequest.CustomerBudgetOwner" type="text" value="" aria-required="true" aria-invalid="false" aria-describedby="txtCustomerBudgetOwner-error">

这是文本框中的值:sdfsdfsdf@sdfsdfsdf

模型状态:


我也发现了这个问题,即客户端和服务器端的验证规则不同。如果在模型上应用了数据注释,您会期望一致的行为,这似乎很奇怪


说我有点犹豫不决——从技术上讲,客户端验证可能更准确,但它是edge案例。

在Razor声明中添加
type=“email”
是否有帮助?诚然,这只是兼容HTML5的浏览器,但现在应该是相当大的一块了。您不需要
[DataType(DataType.EmailAddress)]
[MaxLength]
属性(该属性已包含在
[StringLength]
属性中)。客户端验证工作正常(请参阅)我无法复制你的说法