为什么Html.EditorFor()/ Html.HiddenFor()错误地映射了ID字段?

时间:2017-02-14 21:58:38

标签: c# html asp.net-mvc razor

我有一个MVC 5.2.3网络项目。

我有一个模特:

public class InstanceOnboarding : IInstanceOnboarding
{
    public int ID { get; set; }
    public int InstanceID { get; set; }
    public string InstanceName { get; set; }
    //etc...
}

我正在使用Html.EditorFor显示模型:

@Html.EditorFor(model => model, "InstanceOnboarding")

在Views / Shared / EditorTemplates中我有我的InstanceOnboarding.cshtml文件,它定义了EditorFor()应该如何映射它:

@model Models.InstanceOnboarding

@Html.HiddenFor(model => model.ID)
@Html.HiddenFor(model => model.InstanceID)
@Html.HiddenFor(model => model.AuditFileID)
//etc...

然而,当页面加载并且我在Chrome中检查元素时,我看到了:

<input ... id="ID" name="ID" type="hidden" value="240">
<input ... id="InstanceID" name="InstanceID" type="hidden" value="240">

即使240是InstanceID的值,0也是ID的值。我知道他们是因为我可以在页面加载之前在viewModel中看到它们。没有意义!

知道这是怎么回事吗?

编辑:我已经尝试将ID设置为不为0;这并没有什么不同。

编辑2:按要求显示控制器方法: Controller method with inspecting the value (黑色区域是编辑信息。)

1 个答案:

答案 0 :(得分:1)

出现此问题是因为您的方法具有参数id。如果您使用../EditOnboarding/240导航到该方法,DefaultModelBinder会将id: 240添加到ModelState(我假设您的ShowitOnboarding()方法设置InstanceID的值为id的值,但未设置id值。

生成表单控件的所有HtmlHelper方法首先检查ModelState中的值以及它们是否存在(在您的情况下是id),它们使用该值而不是实际属性值(this answer的第二部分解释了行为)。

解决此问题的一种方法是在返回视图之前调用ModelState.Clear()(这会删除ModelState中的所有值,然后HtmlHelper方法将使用模型属性值)。另一种方法是将方法参数更改为int InstanceID(并为方法添加特定的路由定义,您要创建路由而不是查询字符串)