我有以下代码,但对自定义类型(UserDetails
)的验证没有触发。有没有办法克服这个问题?我知道,如果我在UserModel
中定义UserDetails
的所有属性,它会工作得很好。但是我需要重用UserDetails
模型,
public class UserModel
{
public string Something { get; set; }
public UserDetails User { get; set; }
}
自定义对象,
public class UserDetails
{
[Required]
public string FirtstName { get; set; }
[Required]
public string LastName { get; set; }
[StringLength(50, ErrorMessage = "{0} can not be greater than {1} characters")]
public string Address { get; set; }
}
查看,
@Html.ValidationSummary(true)
@Html.TextAreaFor(model => model.UserDetails.Address , new { rows = "5", cols = "20"})
@Html.ValidationMessageFor(model => model.UserDetails.Address )
....
发布于 2012-02-24 19:28:59
这只是因为元素的ID和名称。例如,在本例中,FirtstName控件的名称为UserModel.FirtstName
,ID为UserModel_FirtstName
,因此在本例中不会触发客户端验证。如果要添加验证,则必须手动添加客户端验证。但是您可以使用ModelState.IsValid
在服务器端验证它
if (!ModelState.IsValid)
{
if( ModelState.IsValidField("UserDetails.FirstName"))
{
ModelState.AddModelError("UserDetails.FirstName", "Error in save");
}
......
}
客户端验证
$("form").validate({
rules: {
"UserDetails.FirstName": { required: true }
}
});
发布于 2012-02-24 11:08:05
如果您正在讨论客户端验证-请确保将视图代码放在
@using(Html.BeginForm(...))
{
...
}
块,并且您已经启用了客户端验证,例如@{Html.EnableClientValidation(); }
也就是说。
@using (Html.BeginForm())
{
@{ Html.EnableClientValidation(); }
@Html.ValidationSummary(true, "Password change was unsuccessful")
<fieldset>
<legend>Change Password Form</legend>
<ol>
<li>
@Html.LabelFor(m => m.OldPassword)
@Html.PasswordFor(m => m.OldPassword)
@Html.ValidationMessageFor(m => m.OldPassword)
..............
至于触发服务器端验证-您应该在操作中调用Model.IsValid
编辑:
我记起了另外一件事:试着在UserModel的用户属性上添加必要的属性
发布于 2012-02-24 13:00:18
为什么不创建您自己的验证规则。您可以使用Ivalidatable对象。检查这个链接,它有很好的解释
https://stackoverflow.com/questions/9429370
复制