【问题标题】:DataType attribute doesn't workDataType 属性不起作用
【发布时间】:2011-08-15 08:26:13
【问题描述】:

在 ASP.NET MVC 3 Web 应用程序中,我有一个视图模型,其属性标记为 DataType 属性,但它们在客户端和服务器端并没有进行实际验证,为什么?

public class RegisterModel
{
    [Required(ErrorMessage = "Phone number is required")]
    [DataType(DataType.PhoneNumber)]
    [Display(Name = "Phone number")]
    public string PhoneNumber { get; set; }

    [Required(ErrorMessage = "E-mail address is required")]
    [DataType(DataType.EmailAddress, ErrorMessage = "Please enter a valid date (ex: 2/14/2011)")]
    [Display(Name = "E-mail address")]
    public string Email { get; set; }
}

感谢您的回复。

【问题讨论】:

    标签: asp.net-mvc-3 validation attributes asp.net-mvc-validation


    【解决方案1】:

    DataType 属性不能用于验证用户输入。它们仅提供使用模板化帮助器呈现值的提示。

    如果没有您需要的内置验证属性,例如 Range 或 Required,那么您应该创建一个自定义属性验证属性并使用该属性装饰您的模型属性以进行验证。例如,对于 DataType.EmailAddress

    这在 Pro Asp.net mvc 3 Framework 中有描述(Adam Freeman 和 Steve Sanderson,第 618 页左右)

    【讨论】:

      【解决方案2】:

      您是否包括:

      <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
      

      在您的母版页中?

      另外,你需要这些在你的Web.config:

      <appSettings>
          <add key="ClientValidationEnabled" value="true"/>
          <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
      </appSettings>
      

      【讨论】:

      • 也添加了 web.config 位。见上文。
      • 这个答案只与启用客户端验证的问题有关。它与您的问题或疑问无关。
      【解决方案3】:

      我同意 DataType 属性不执行任何验证的事实。但是你有需要的属性应该可以工作。

      您必须放置一个表单来呈现您的属性的控件。当表单发布时点击提交。

      假设您的表单发布到以下方法。

      [HttpPost]
              public ActionResult SaveRegisterDetails(Register registerDetails)
              {
                  if (ModelState.IsValid)
                      return View();
                  else
                      return View("Index", registerDetails);
              }
      

      将您的 ViewModel 对象作为参数传递。从表单发布的所有值都将出现在此对象中。然后检查 ModelState 是否有效。如果它无效,则返回与表单发布位置相同的视图,并将 ViewModel 对象作为参数传递。

      如果您使用的是 EditorForModel 或 DisplyForModel,请使用 ValidationSummary 助手在 UI 上显示错误消息。

      【讨论】:

        【解决方案4】:

        对于 .NET 框架 4.5 及更高版本,有一个名为 [EmailAddress] 的验证属性,可以像这样将其用于您的属性

        [Required]
        [DataType(DataType.EmailAddress)]
        [EmailAddress(ErrorMessageResourceName = "MustBeEmail", ErrorMessageResourceType = typeof(Resources))]
        public string Email { get; set; }
        

        另外不要忘记确保您在web.config 文件中启用了客户端验证并且不显眼

        <appSettings>
            <add key="ClientValidationEnabled" value="true"/>
            <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
        </appSettings>
        

        并在您的剃须刀中包含js 文件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-13
          • 2016-02-06
          • 2011-03-31
          • 2018-11-19
          • 2012-07-23
          • 2016-07-16
          • 2020-01-24
          相关资源
          最近更新 更多