首页 文章

为什么我的ActionCesult参数覆盖了我的MVC ViewModel成员?

提问于
浏览
5

这是一个错误还是一个功能?

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

我有一个包含名为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等相同 .

是什么赋予了?

EDIT: 我想在很久以前更新这个,但从来没有解决过这个问题 . 发生这种情况的原因是因为ModelState将在方法中具有"id"参数的"id"条目,并且MVC ViewEngine在填充Html助手而不是模型时首先检查ModelState . In order to work around this, you can simply add the following line in your controller just before the return:

ModelState.Remove("id");

现在<%= Html.TextBox(“ID”,Model.ID)%>将从Model获取值,而不是ModelState . 问题解决了 .

1 回答

  • 7

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

相关问题