【问题标题】:Data annotations MVC3 Required attribute数据注释 MVC3 必需属性
【发布时间】:2013-02-15 01:57:18
【问题描述】:

我有下面的模型(用户),我用它来添加新用户和更新现有用户。 添加新用户时需要输入用户名和密码,更新时只需要输入用户名,因为不允许更改密码。这是问题,添加一个新用户一切正常,因为我输入了名称和密码值,所以 ModelState.IsValid 返回 true,但是在更新用户时没有输入密码,所以它总是有 null 值是什么使得ModelState.IsValid 一直返回 false。 即使在“添加视图”中需要密码而在“更新视图”中不需要密码,有没有办法使用相同的模型? 请问有什么建议吗?

     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();
        }

【问题讨论】:

    标签: asp.net-mvc-3 model data-annotations modelstate


    【解决方案1】:

    您应该使用视图模型。

    然后,您的数据注释将属于正在传递给视图的视图模型

    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
        }
    

    将这些类传递给您的视图,而不是您的域模型 (User),然后在控制器中将视图模型属性映射回模型,然后再持久化到您的数据源。

    【讨论】:

    • 所以我应该有两个模型吗? DbSet 的 POCO 类用户和 ViewModel 的其他用户类?
    • 你应该有一个 poco,用户;然后根据您的视图需要尽可能多的视图模型。
    【解决方案2】:

    我通常在BaseViewModel 中指定要隐藏哪些元素,然后使用 jQuery 隐藏它们。但是,如果您使用比我通常的从上到下的基于列的布局更多的“花哨”布局,它可能会弄乱您的布局。隐藏form-group 为每个要隐藏的元素,它下面的元素只是向上移动。

    我的主要工作是 LOB 内网应用,所以我大部分时间都会跳过所有花哨的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多