在哪里放置验证注释ViewModel或Domain对象?

时间:2010-12-02 05:27:40

标签: asp.net-mvc automapper

我的问题是

当我从我的Create Controller传递UserCreateViewModel时,这意味着我的验证(ModelState.IsValid)将仅起作用 在UserCreateViewModel上,如果在其上定义了注释。但是我无法在每个ViewModel上定义DataAnnotation,因为这将是很多工作。 相反,我想把它放在用户域模型上。那么如何修复Create方法来修复我的Annotation工作和mapper,而无需向控制器添加更多代码。

//我的控制器创建方法

[HttpPost]
public ActionResult Create(UserCreateViewModel user)
{
    if (ModelState.IsValid)
    {
        var createUser = new User();
        Mapper.Map(user, createUser);

        _repository.Add(createUser);

        return RedirectToAction("Details", new { id = createUser.UserId });
    }

    return View("Edit", user);
}

// UserCreateViewModel - >创建特定视图模型

public class UserCreateViewModel
{
    public string UserName { get; set; }
    public string Password { get; set; }
}

//用户 - >域对象

[MetadataType(typeof(User.UserValidation))]
public partial class User 
{
    private class UserValidation
    {
        [Required(ErrorMessage = "UserName is required.")]
        [StringLength(50, MinimumLength = 2, ErrorMessage = "{0} is between {1} to {2}")]
        [RegularExpression(@"(\S)+", ErrorMessage = "White space is not allowed")]
        public string UserName { get; set; }

        [Required(ErrorMessage = "Password is required.")]
        [StringLength(50, MinimumLength = 2, ErrorMessage = "{0} is between {1} to {2}")]
        public string Password { get; set; }
    }
}  

1 个答案:

答案 0 :(得分:1)

验证应至少放在视图模型上,因为这是您作为用户输入接收的内容。就模型的验证而言,您也可以添加它,但只要您将视图模型传递给POST操作(这正是您应该做的),模型的验证将被忽略。当然这不是问题,因为模型可能会在其他应用程序上重用,而不使用视图模型,这样您的模型就可以保证有效。就ASP.NET MVC而言,此步骤不是必需的。