如何验证MVC3自定义对象属性

时间:2012-02-24 10:43:19

标签: asp.net asp.net-mvc asp.net-mvc-3 razor

我有以下代码,但自定义类型(UserDetails)的验证未触发。有没有办法克服这个问题?我知道,如果我在UserDetails内定义UserModel的所有属性,它将正常工作。但我需要重复使用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 )
....

3 个答案:

答案 0 :(得分:0)

如果您正在谈论客户端验证 - 请确保您的视图代码放在

@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

编辑:

记住别的东西: 尝试将[Required] attibute放在UserModel中的User属性

答案 1 :(得分:0)

为什么不创建自己的验证规则。你可以使用Ivalidatable Object。检查这个链接,它有很好的解释

  1. Asp.net Ivalidatable object implementation
  2. Validation in asp.net mvc3

答案 2 :(得分:0)

这只是因为元素的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 }
    }
});