1

在 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; }
}

感谢回复。

4

4 回答 4

4

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

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

这在 Pro Asp.net mvc 3 Framework(Adam Freeman 和 Steve Sanderson,第 618 页或其附近)中进行了描述

于 2011-08-15T09:48:07.630 回答
0

您是否包括:

<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>
于 2011-08-15T08:30:04.047 回答
0

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

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

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

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

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

如果您使用 EditorForModel 或 DisplyForModel,则使用 ValidationSummary 帮助器在 UI 上显示错误消息。

于 2013-04-20T19:34:38.110 回答
0

对于 .NET 框架 4.5 及更高版本,有一个名为[EmailAddress]use it for your property 的验证属性,如下所示

[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并在剃须刀中包含文件。

于 2018-03-18T15:16:58.853 回答