数据注释MVC3必需属性

问题描述:

我有下面的模型(用户),我用它来添加新用户并更新现有用户。 当我添加一个新用户时,需要输入用户名和密码,并且在更新时,只需输入用户名,因为它不允许更改密码。问题在于,添加一个新用户一切正常,因为我输入了名称和密码值,所以ModelState.IsValid返回true,但是当更新用户时没有输入密码,所以它总是有空值,这使得ModelState.IsValid始终返回false。 有没有办法使用相同的模型,即使在添加视图中需要密码并且在更新视图中它不是? 请问,有什么建议吗?数据注释MVC3必需属性

 public class User { 

     public int ID { get; set; } 

     [Display(Name = "Nome do Usuário")] 
     [Required(ErrorMessage = "Digite o Nome do Usuário.")] 
     public string name { get; set; } 

     [Display(Name = "Senha")] 
     [Required(ErrorMessage = "Digite a Senha.")] 
     public string password { get; set; } 

    } 



public ActionResult Add() 
     { 
      return View(); 
     } 

     [HttpPost] 
      public ActionResult Add(User user) 
      { 
       UsuariosViewModel viewModel = new UsuariosViewModel(); 


       if (ModelState.IsValid) 
       { 
        viewModel.Msg = new AdmUsuarios().CadastraUsuario(user); 
       } 
       return View(viewModel); 
      } 



    public ActionResult Update(int id) 
      { 
       UsuariosViewModel viewModel = new UsuariosViewModel(); 

      using (var dataContext = new DBEntities()) 
      { 
       Repository<User> repository = new Repository<User>(dataContext); 
       viewModel.User = repository.GetById(id); 
      } 

       return View(viewModel); 
      } 

     [HttpPost] 
     public ActionResult Update(User user, int id) 
     {   
      UsuariosViewModel viewModel = new UsuariosViewModel(); 

      if (ModelState.IsValid) 
      { 
       viewModel.Msg = new AdmUsuarios().AlteraUsuario(user, id); 
      } 
      return View(); 
     } 

您应该使用视图模型。

你的数据的注释,然后将在视图模型属于被传递到视图

public class CreateViewModel 
{ 
    public int ID { get; set; } 

    [Display(Name = "Nome do Usuário")] 
    [Required(ErrorMessage = "Digite o Nome do Usuário.")] 
    public string name { get; set; } 

    [Display(Name = "Senha")] 
    [Required(ErrorMessage = "Digite a Senha.")] 
    public string password { get; set; } 
} 

和编辑

public class EditViewModel 
    { 
     public int ID { get; set; } 

     [Display(Name = "Nome do Usuário")] 
     [Required(ErrorMessage = "Digite o Nome do Usuário.")] 
     public string name { get; set; } 

     //perhaps you don't need the password at all in the edit view 
    } 

通过这些类视图(S),而不是你的域模型(User),然后在控制器中将视图模型属性映射回模型,然后保留到数据源。

+0

so我应该有两个模型?一个POCO类User将DbSet和其他User类用于ViewModel? – Sah 2013-02-28 18:42:44

+1

你应该有一个poco,User;那么尽可能多的视图模型,你需要你的意见。 – 2013-02-28 18:45:00

+0

我明白了,非常感谢! – Sah 2013-02-28 18:49:23

我通常在我的BaseViewModel中指定要隐藏的元素,然后使用jQuery来隐藏它们。尽管如此,如果使用比我通常的从顶部到底部列的布局更多的“花哨”布局,它可能会混淆你的布局。隐藏每个要隐藏的元素的form-group,并且它下面的元素只是向上移动。

我的主要工作是LOB内联网应用程序,所以我大部分时间都跳过所有幻想。