Tom*_*eck 3 html-helper asp.net-mvc-3 html.hiddenfor
我偶然发现ASP.Net MVC的一个非常奇怪的情况,传递一个"id"作为动作参数和一个"id"隐藏的表单元素.我有一个具有"id"参数的动作.此id值表示项目.我有一个控制器操作,我正在创建一个数据输入表单,用于将员工分配给传入的项目(我创建一个下拉列表,管理员选择要分配给传递项目的员工).通过将员工分配给项目,我创建了一个ProjectEmployee记录(项目ID,员工ID和表示组合的ID,该组合是数据库中的标识列).标识列(名为"id")也是隐藏的表单元素.这是必要的,因为我需要能够在以后编辑项目/员工分配.
无论如何,在为项目创建新的员工分配时,项目ID(传递给操作的"id")将应用于"id"隐藏的表单元素.
我正在通过117行动.117是projectId.它被设置为"id"隐藏字段,该字段应该为0,因为0表示新项目/员工的分配.
查看模型
id - unique id that represents the Project/Employee combination
projectId - the "Id" being passed to action
EmployeeId - what the admin is selecting from drop down
rate
startdate
endDate
...
Run Code Online (Sandbox Code Playgroud)
数据输入表格
@Html.HiddenFor(m => m.Id)
@Html.HiddenFor(m => m.ProjectId)
...
Id: @Model.Id <br />
ProjectId: @Model.ProjectId<br />
Run Code Online (Sandbox Code Playgroud)
因此,@ Html.HiddenFor(m => m.Id)呈现隐藏的表单元素,其值为117. @ Model.Id将0呈现给UI.单步执行代码我可以在视觉上看到Id属性的值为0.为什么HiddenFor会将它的线交叉并拉出117的值?
这个bug已经进入了生产阶段,所以我手上的数据搞得一团糟,因为我没有在数据库表中创建新记录,而是实际更新了现有记录,因为"Id"属性被错误地设置了从0(表示新记录)到117(这是projectId),因此我正在更新不同的记录.
为什么HiddenFor会让它的电线交叉并拉出117的值?
这是设计的.所有HTML帮助程序(如TextBoxFor和HiddenFor)在绑定时首先使用ModelState的值,然后使用模型的值.我假设您的控制器操作如下所示:
public ActionResult Foo(int id)
{
SomeModel model = ...
// At this stage model.Id = 0
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
问题是默认模型绑定id器使用辅助程序使用的键将值添加到ModelState中,并忽略模型属性值.这不是一个错误.这是HTML帮助程序的设计方式.当你不知道它时,它在开始时有点混乱,但是一旦你习惯了这种行为,你就不会再陷入陷阱.
解决问题的一种可能性是从ModelState中删除此值:
public ActionResult Foo(int id)
{
ModelState.Remove("id");
SomeModel model = ...
// At this stage model.Id = 0
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
或者将Id模型中的属性重命名为其他内容以避免冲突.
| 归档时间: |
|
| 查看次数: |
1437 次 |
| 最近记录: |