我有一个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;这并没有什么不同。
答案 0 :(得分:1)
出现此问题是因为您的方法具有参数id
。如果您使用../EditOnboarding/240
导航到该方法,DefaultModelBinder
会将id: 240
添加到ModelState
(我假设您的ShowitOnboarding()
方法设置InstanceID
的值为id
的值,但未设置id
值。
生成表单控件的所有HtmlHelper
方法首先检查ModelState
中的值以及它们是否存在(在您的情况下是id
),它们使用该值而不是实际属性值(this answer的第二部分解释了行为)。
解决此问题的一种方法是在返回视图之前调用ModelState.Clear()
(这会删除ModelState
中的所有值,然后HtmlHelper
方法将使用模型属性值)。另一种方法是将方法参数更改为int InstanceID
(并为方法添加特定的路由定义,您要创建路由而不是查询字符串)