【问题标题】:HiddenFor(x => x.Id) is being populated by the UrlParameter instead of the ViewModelHiddenFor(x => x.Id) 由 UrlParameter 而不是 ViewModel 填充
【发布时间】:2012-02-03 15:46:42
【问题描述】:
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 路由信息?

附:我不想重命名参数,因为除非我更改路由信息,否则我会丢失漂亮的 url。我已经这样做了,它确实有效,但不是我想要的。

【问题讨论】:

  • 在我看来,您在渲染视图之前没有正确设置模型值。这似乎是描述你所看到的唯一方式。
  • 您是否尝试过将@model 放在您的视图中?
  • 是的,我在视图上还有其他几个“HiddenFor”,它们都正确映射到模型。只有这个映射不正确。在我将操作的参数名称从 id 更改为 x_id 后,它工作正常。但是我的网址从“/account/2”变成了“/account?x_id=2”。
  • 表达式右侧的“x”是什么? x.身份证?除非您已标记“x”,否则您应该使用“Model.Id”。
  • @Splash-X 这是使用模型的标准 lambda。 x(或此处的任何字母)是模型。他的语法很好。

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


【解决方案1】:

Action 被调用时,框架会根据查询字符串值、后置数据、路由值等构建ModelStateCollection。这个ModelStateCollection 将被传递给View。在尝试从实际模型中获取值之前,所有 HTML 输入助手都尝试从 ModelStateCollection first 获取值。

因为您的输入模型是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);
}

【讨论】:

【解决方案2】:

你可以在下面试试这个

<input id="Id" type="hidden" value="@Model.Id" />

可能不是你想要的,但本质上是一样的。

【讨论】:

    【解决方案3】:

    您可以使用TextBoxFor 并使用 CSS as 将其隐藏

    @Html.TextBoxFor(x => x.Id, new { @style="visibility:hidden; width:4px;"})
    

    它对我有用。

    【讨论】:

      猜你喜欢
      • 2012-06-26
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多