HiddenFor(x => x.Id)由UrlParameter而不是ViewModel填充

时间:2012-01-05 20:00:42

标签: asp.net-mvc asp.net-mvc-3 lambda model-binding

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。我宁愿不重命名参数因为那时我会丢失我看起来很漂亮的网址,除非我改变路由信息。我已经做到了,它确实有效,但不是我想要的。

3 个答案:

答案 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;"})

它对我有用。