【问题标题】:Why is my MVC ViewModel member overridden by my ActionResult parameter?为什么我的 MVC ViewModel 成员被我的 ActionResult 参数覆盖?
【发布时间】:2011-03-29 04:40:12
【问题描述】:

这是错误还是功能?

为了简洁和易于复制,下面的所有代码都进行了简化,除了突出显示行为之外实际上并没有做任何有用的事情。

我有一个包含名为 ID 的 int 的类:

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

在我的控制器中,我有一个 Edit actionresult,它带有一个名为“id”的参数:

public ActionResult Edit(int id)
{
    return View(new FooterLink() { ID = 5 }); //notice that I am explicitly setting the ID value here.
}

在我的索引视图中,我有一个指向指定“id”参数的编辑操作的链接:

<%= Html.ActionLink("Edit", "Edit", new { id = 1 })%>

在我看来,我有几个文本框:

<%= Html.TextBox("ID", Model.ID)%>
<%= Html.TextBox("Blah", Model.ID) %>

在 HTML 中呈现以下内容:

<input id="ID" name="ID" type="text" value="1">
<input id="Blah" name="Blah" type="text" value="5">

请注意,ID 为“ID”的输入不是像我告诉它的那样从模型中获取其值……而是从提供给我的 ActionResult 的参数中获取的。 此行为与 Html.TextBoxFor、Html.Hidden、Html.HiddenFor 等相同。

什么给了?

编辑:我很久以前就打算更新它,但一直没有解决。发生这种情况的原因是因为 ModelState 将在方法中有一个带有“id”参数值的“id”条目,并且 MVC ViewEngine 在填充 Html 帮助程序而不是 Model 时首先检查 ModelState。 为了解决这个问题,您只需在控制器中添加以下行,就在 return 之前:

ModelState.Remove("id");

现在 将从模型而不是模型状态中获取值。问题解决了。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-2 html-helper


    【解决方案1】:

    这就是 html 助手的工作方式。他们将首先查看请求 url 中是否有 ID 参数,并使用该值而不是模型中指定为第二个参数的值。

    【讨论】:

    • 确实,似乎确实如此。这对我来说似乎是错误的。当您只给它一个名称(即 )时,这是正确的行为,但是如果我指定该值应该来自使用 或 x.ID)%>,那么我认为这就是值的来源。 TextBoxFor 表现出这种行为尤其令人不安,因为这应该完全是模型驱动的。
    • @Bradley,我同意你的观点,这种行为可能会误导不熟悉它的人,但一旦你习惯了它应该没有问题。
    • 抱歉,我花了这么长时间才接受这个答案。分心了....一年...:)
    猜你喜欢
    • 1970-01-01
    • 2011-09-22
    • 2019-06-01
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    相关资源
    最近更新 更多