public ActionResult SomeAction(int Id){
//Id is set to 2
var model = //get some thing from db using Id(2);
//Now model.Id is set to 9;
return View(model);
}
----------View----------
@Html.HiddenFor(x => x.Id)
当我查看源时,此隐藏字段设置为2而不是9.如何将其映射到模型而不是映射到URL路由信息?
P.S。我宁愿不重命名参数因为那时我会丢失我看起来很漂亮的网址,除非我改变路由信息。我已经做到了,它确实有效,但不是我想要的。
答案 0 :(得分:24)
当调用Action
时,框架会根据查询字符串值,后期数据,路由值等构建ModelStateCollection
。此ModelStateCollection
将传递给View
{1}}。在尝试从实际模型中获取值之前,所有HTML输入帮助程序都尝试从ModelStateCollection
第一个获取值。
因为您的输入模型是int id
,但输出模型是一些新模型,助手将使用ModelStateCollection
(来自查询字符串)中的值,因为名称Id
是匹配。
要使其正常工作,您必须在将新模型返回到视图之前手动清除ModelStateCollection
:
public ActionResult SomeAction(int Id){
//Id is set to 2
ModelState.Clear();
var model = //get some thing from db using Id(2);
//Now model.Id is set to 9;
return View(model);
}
答案 1 :(得分:4)
您可以尝试以下
<input id="Id" type="hidden" value="@Model.Id" />
可能不是你想要的,但基本上做同样的事情。
答案 2 :(得分:0)
您可以使用TextBoxFor
并使用CSS将其隐藏为
@Html.TextBoxFor(x => x.Id, new { @style="visibility:hidden; width:4px;"})
它对我有用。