我正在开发一个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)
}
奇怪的是,即使模型属性在传递给View时具有不同的值,隐藏的输入也会获得相同的值。例如。如果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 =&gt; model.Id)将值设置为与model.MappedId相同的值,即使model.Id在传递给View时具有不同的值? / p>
答案 0 :(得分:2)
我的猜测是你从动作的id参数中获取MappedId值。然后使用其他值设置Id属性。但是在您的视图中,您仍然具有来自action参数的Id值,并且默认模型绑定器使用该值来绑定Id属性。它基本上忽略了模型实例的值。
您可以通过更改模型中Id属性的名称来解决此问题。如果您不想这样,则应更改操作参数的名称。但是,如果您不想通过查询字符串传递其值,则需要为其创建自定义路由。