【问题标题】:Why isn't my ModelState updating in the controller when using a View Model (MVC)?为什么在使用视图模型 (MVC) 时我的 ModelState 没有在控制器中更新?
【发布时间】:2021-06-14 00:55:21
【问题描述】:

我正在通过 ajax 调用向视图上的控制器发送一些信息。控制器将发布数据绑定到视图模型,如下所示:

UserController.cs

    [HttpPost]
    public ActionResult UserInfo(UserPositionVM userposvm)
    {
        //Check if user already exists in the database.
        int? user_id = userposvm.User.userid;
        var userindb = db.Users.Where(x => x.userid == user_id).FirstOrDefault();

        /If the user does exist in the database, assign that User model to the view model.
        if (userindb != null)
            userposvm.User = userindb;

        userposvm.User.Office = 3;
        return PartialView(userposvm);
    }

还有我的视图模型...

UserPosition.cs

public class UserPositionVM
{
    public Users User { get; set; }
    public Positions Position { get; set; }
}

对于视图,我有这个:

AssignUser.cshtml

...
...
...
@Html.TextBoxFor(model => model.User.Office, new { @readonly = "readonly", @class = "form-control"})
@Model.User.Office
...
...
...

有趣的是,TextBoxFor 不填充值 (3),但 @Model.User.Office 填充。经过一番研究,我发现它与 ModelState 有关。但是,我似乎无法在我的控制器发布方法中更新 ModelState。

我尝试在函数开始时使用 ModelState.Clear(),以及在返回 PartialView() 之前使用 UpdateModel(userposvm.User)。我看到了另一篇与我类似的帖子 (stackoverflow.com/questions/10248757),但它已过时,我无法再访问其中一个答案中的博客。

我该如何解决这个问题?此外,在控制器内编辑模型值,然后将其发送回视图的最佳方法是什么?

【问题讨论】:

  • 你的 javascript/ajax 代码是什么?
  • 您正在将复杂模型传递给控制器​​。您必须在方法中指定如何处理此请求。

标签: c# asp.net .net asp.net-mvc asp.net-mvc-5


【解决方案1】:

好的,我现在感觉很傻,但我能够解决我的问题。首先,对于其他为此苦苦挣扎的人,我强烈建议您观看此视频:https://www.youtube.com/watch?v=9ul8oihM8hc&ab_channel=TechCBT

我没有完全理解 ModelState 和 Model 本身之间的关系。因此,ModelState 是在控制器中通过从 post 数据绑定来创建的。 ModelState 背后的整个想法(据我了解)是您可以在 View 中使用 HTML Helpers,然后它们将从 ModelState 中查找数据。

通常,当您提交表单时,如果您重定向到您提交表单的同一页面,您在表单中输入的所有值都将被清除并重置。但是,如果您使用 HTML Helpers,它将检查 ModelState 中是否有任何值。如果是,它们会将相应的值加载到字段中。

问题是,ModelState 实际上优先于 Model 本身。换句话说,HTML Helper 将首先检查 ModelState。如果它找到具有值的对应键,它将加载该数据。如果它在 ModelState 中没有找到任何东西,那么它将引用该模型。这正是为什么我的 TextBoxFor 加载的值与模型中的值不同的原因;因为它在 ModelState 中找到了一些东西,所以它完全忽略了 Model。

所以,使用 ModelState.Clear() 确实 解决了这个问题。但是,我在执行 ModelState.Clear() 时没有看到结果的原因是(很尴尬)我在视图中错误地指定了帮助。所以它只是显示 null 而不是 3。希望这可以帮助遇到类似问题的其他人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-15
    • 2017-07-12
    • 2013-06-26
    • 2021-08-20
    • 1970-01-01
    • 2016-10-22
    • 2020-02-17
    • 2011-12-20
    相关资源
    最近更新 更多