【问题标题】:Why do @Html.HiddenFor set value for other model property than specified?为什么@Html.HiddenFor 为其他模型属性设置值而不是指定的值?
【发布时间】:2012-12-09 16:07:44
【问题描述】:

我正在开发一个 ASP.NET MVC3 项目,我在其中定义了以下模型:

public class Model{
    [Key]
    int Id { get; set; }
    int MappedId { get; set; }
}

这个模型从Controller传递到Razor视图,如下:

public class Controller:Controller{
    public ActionResult Edit(int id) {
        Model model = repository.Get(id);
        return View(model);
    }
}

模型属性在视图中呈现:

@using(Html.BeginForm()) {
    @Html.HiddenFor(model => model.Id);
    @Html.HiddenFor(model => model.MappedId)
}

奇怪的是,两个隐藏的输入得到相同的值,即使模型属性在传递给视图时具有不同的值。例如。如果 Model.Id 的值为 0 且 Model.MappedChannelId 的值为 7,则两个隐藏输入都设置为相同的值 7:

<input id="Id" class="valid" type="hidden" value="7" name="Id" data-val-required="The Id field is required." data-val-number="The field Id must be a number." data-val="true">
<input id="MappedId" class="valid" type="hidden" value="7" name="MappedId" data-val-required="The MappedId field is required." data-val-number="The field MappedId must be a number." data-val="true">

有没有人知道为什么 Html.HiddenFor(model=> model.Id) 将值设置为与 model.MappedId 相同的值,即使 model.Id 在传递给 View 时具有不同的值?

【问题讨论】:

  • 这不正常。我怀疑您的值可能在它们到达渲染引擎之前已经在某个地方发生了变化。检查return View(model) 语句中的模型状态,然后在视图中遇到@Html... 语句后再次检查。

标签: asp.net-mvc-3 razor


【解决方案1】:

我的猜测是您从操作的 id 参数中获取 MappedId 值。然后用其他值设置 Id 属性。但是,在您看来,您仍然有来自 action 参数的 Id 值,并且默认模型绑定器使用该值来绑定 Id 属性。它基本上忽略了模型实例中的值。

您可以通过更改模型中的 Id 属性名称来解决它。如果您不想这样,您应该更改操作参数的名称。但是,如果您不想通过查询字符串传递其值,则需要为其创建自定义路由。

【讨论】:

  • 这听起来很合理,很可能是我的问题的原因。我会立即试用您提出的解决方案!
猜你喜欢
  • 2011-10-14
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
相关资源
最近更新 更多