2015-07-20 67 views
1

因此,我有一个我很好奇的问题。我有一个UserAccountViewModel,我正在重新使用它来创建帐户视图和编辑帐户视图。这样我可以为我的代码使用一个视图和一个视图模型,但是可以使用不同的控制器操作。由于未设置所需的属性,所以ModelState为false

在创建帐户,用户名,密码和确认密码都是必填字段。但是,在编辑帐户上,这些字段不是必填字段(我在编辑帐户的视图中隐藏这些字段)。

问题是,当我这样做:

[HttpPost] 
public ActionResult EditUserAccount_Save(UserAccountViewModel editUserAccountViewModel) 
{ 
    var errors = ModelState.Values.SelectMany(v => v.Errors); 
    if (ModelState.IsValid) 
    { 
     editUserAccountViewModel.UserName = UserSession.GetValue(StateNameEnum.UserName, StateNameEnum.UserName.ToString()) as string; 

     db_user user = new db_user(); 
     user.Title = editUserAccountViewModel.Title; 
     user.FirstName = editUserAccountViewModel.FirstName; 
     user.LastName = editUserAccountViewModel.LastName; 
     user.PhoneNumber = editUserAccountViewModel.PhoneNumber; 
     user.AltPhoneNumber = editUserAccountViewModel.AltPhoneNumber; 
     user.EmailAddress = editUserAccountViewModel.EmailAddress; 
     user.LanguageId = context.languages.Where(t => t.Code == editUserAccountViewModel.Language).Select(t => t.Id).FirstOrDefault(); 
     user.CreatedDate = DateTime.Now; 
     user.UserId = WebSecurity.GetUserId(editUserAccountViewModel.UserName); 

     context.Entry(user).State = EntityState.Modified; 
     context.SaveChanges(); 

     JsonResult res = Json(new { Success = true, data = "", Message = "" }); 
     return res; 
    } 
    JsonResult res2 = Json(new { Success = false, data = "", Message = "" }); 
    return res2; 
} 

我ModelState.IsValid返回false,我添加了错误上述声明,它说:

这是因为用户名,密码和确认密码字段需要。如何重新使用我的viewmodel,以便在创建帐户时可以使用这些字段,但在编辑帐户时不需要这些字段?也就是说,我想保持这些字段是相同的(在编辑帐户中不可编辑?)

+0

使用视图模型的整点是答案在视图中只包含你需要的属性 - 参考[什么是MVC中的ViewModel?](http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc)。创建2个视图模型,EditAccountVM和CreateAccountVM(它继承自EditAccountVM并包含3个额外的必需属性。 –

回答

3

您可以将某些虚拟值输出到视图中的隐藏字段,以便它们在返回时不会为空,但是,这是更多的数据被来回推送。其次,您可以从模型状态中删除键,从而删除它们的错误。

ModelState.Remove("UserName"); 
ModelState.Remove("Password"); 
ModelState.Remove("ConfirmPassword"); 

这样做后,当你调用ModelState.IsValid,它会给只是基于你有兴趣

HTH领域

+0

啊好吧,所以我可以在我的控制器中检查模型状态之前做到这一点吗?谢谢,它看起来像我可以这样做:) –

+0

Oh我有一个问题,关于context.SaveChanges(),我得到了这个异常:{“一个或多个实体的验证失败,更多细节请参阅'EntityValidationErrors'属性。 DbEntityValidationException由用户代码“ –

+0

未处理”您需要为此提出一个新问题。如果您查看异常详细信息并查找数据库验证错误,它可能会指示您出现了什么问题 – Slicksim

相关问题