在ASP.NET MVC 3 Web应用程序中,我有一个viewModel,其属性标记有DataType属性,但它们不在cliant端进行实际验证,在服务器端,为什么?
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; }
}
感谢您的回复。
答案 0 :(得分:4)
DataType属性不能用于验证用户输入。它们仅提供使用模板化助手渲染值的提示。
如果没有您需要的内置验证属性,例如Range或Required,那么您应该做的是创建自定义属性验证属性并使用它来修饰您的模型属性以进行验证。 EG,用于DataType.EmailAddress
这在Pro Asp.net mvc 3 Framework(Adam Freeman和Steve Sanderson,第618页左右)中有所描述
答案 1 :(得分: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>
答案 2 :(得分: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上显示错误消息。
答案 3 :(得分:0)
对于.NET framework 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
个文件。