【问题标题】:ModelState is false due to required properties not set由于未设置必需的属性,ModelState 为 false
【发布时间】:2015-07-20 14:32:52
【问题描述】:

所以,我有一个问题我很好奇。我有一个 UserAccountViewModel,我正在重用它来创建帐户视图和编辑帐户视图。这样我就可以为我的代码使用一个视图和一个视图模型,但可以使用不同的控制器操作。

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

问题是当我这样做时:

[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,我在上面添加了错误语句,它说:

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

【问题讨论】:

  • 使用视图模型的全部意义在于只在视图中包含您需要的那些属性——请参阅What is ViewModel in MVC?。创建 2 个视图模型,EditAccountVMCreateAccountVM(继承自 EditAccountVM 并包含 3 个额外的必需属性。

标签: c# asp.net-mvc-4 viewmodel


【解决方案1】:

您可以将一些虚拟值输出到视图中的隐藏字段中,这样当它们返回时它们不会为空,但是,更多的数据被来回推送。

其次,您可以从模型状态中删除键,从而消除它们的错误。

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

之后,当你调用 ModelState.IsValid 时,它只会根据你感兴趣的字段给出答案

HTH

【讨论】:

  • 啊,好吧,所以我可以在我的控制器中执行此操作,然后再检查模型状态?谢谢,看来我可以做点什么了。
  • 哦,我有问题。在 context.SaveChanges() 上,我收到此异常:{“一个或多个实体的验证失败。有关更多详细信息,请参阅 'EntityValidationErrors' 属性。”}。我得到“用户代码未处理 DbEntityValidationException”
  • 您需要为此提出一个新问题。如果您查看异常详细信息并发现 db 验证错误,它可能会指出您出了什么问题
  • 如何查找或获取特定的数据库验证错误?
  • 如果在 try catch 块中捕获异常,则在 catch 块中设置断点。您将在那里获得异常详细信息,您可以挖掘对象以查找验证错误
猜你喜欢
  • 2014-11-18
  • 2019-05-27
  • 1970-01-01
  • 2014-10-15
  • 2014-12-15
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多