gpt4 book ai didi

asp.net-mvc-3 - hiddenFor 助手从 Action 参数中提取 id,而不是 viewModel

转载 作者:行者123 更新时间:2023-12-01 09:34:14 25 4
gpt4 key购买 nike

我偶然发现了 ASP.Net MVC 的一个非常奇怪的情况,传递一个“id”作为操作参数和一个“id”隐藏表单元素。我有一个带有“id”参数的 Action 。这个 id 值代表一个项目。我有一个 Controller 操作,我正在创建一个数据输入表单,用于将员工分配给传入的项目(我创建一个下拉列表,管理员在其中选择要分配给通过的项目的员工)。通过将员工分配给项目,我创建了一个 ProjectEmployee 记录(项目 id、员工 id 和一个表示组合的 id,它是数据库中的一个身份列)。身份列(名为“id”)也是一个隐藏的表单元素。这是必要的,因为我需要能够在以后编辑项目/员工分配。

无论如何,在为项目创建新员工分配时,项目 ID(即传递给操作的“id”)将应用于“id”隐藏表单元素。

我将 117 传递给行动。 117 是项目 ID。它被设置为应为 0 的“id”隐藏字段,因为 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
...

数据输入表

@Html.HiddenFor(m => m.Id) 
@Html.HiddenFor(m => m.ProjectId)
...
Id: @Model.Id <br />
ProjectId: @Model.ProjectId<br />

所以,@Html.HiddenFor(m => m.Id) 会渲染一个隐藏的表单元素,其值为 117。@Model.Id 会向 UI 渲染 0。单步执行代码,我可以直观地看到 Id 属性的值是 0。HiddenFor 是如何让它的电线交叉并拉出 117 的值?

这个错误已经进入生产阶段,所以我手上的数据变得一团糟,因为我没有在数据库表中创建新记录,而是在更新现有记录,因为“Id”属性是错误地从 0(表示新记录)设置为 117(即 projectId),因此正在更新不同的记录。

最佳答案

How come HiddenFor is getting it's wires crossed and pulling the value of 117?

这是设计使然。 TextBoxFor 和 HiddenFor 等所有 HTML 助手在绑定(bind)时首先使用 ModelState 的值,然后再使用模型的值。我认为您的 Controller 操作如下所示:

public ActionResult Foo(int id)
{
SomeModel model = ...
// At this stage model.Id = 0
return View(model);
}

问题是默认模型绑定(bind)器将一个值添加到 ModelState 中,其键 id 由帮助程序使用,并且模型属性值被忽略。这不是错误。这就是 HTML 助手的设计方式。刚开始不知道的时候会有点迷惑,但是一旦习惯了这种行为,就不会再掉入陷阱了。

解决此问题的一种方法是从 ModelState 中删除此值:

public ActionResult Foo(int id)
{
ModelState.Remove("id");
SomeModel model = ...
// At this stage model.Id = 0
return View(model);
}

或将模型中的 Id 属性重命名为其他名称以避免冲突。

关于asp.net-mvc-3 - hiddenFor 助手从 Action 参数中提取 id,而不是 viewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11190989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com