MVC3 Html.HiddenFor(Model => Model.Id) 不传回控制器
Posted
技术标签:
【中文标题】MVC3 Html.HiddenFor(Model => Model.Id) 不传回控制器【英文标题】:MVC3 Html.HiddenFor(Model => Model.Id) not passing back to Controller 【发布时间】:2011-09-26 10:04:32 【问题描述】:我使用脚手架代码创建了一个强类型 MVC3 Razor 视图。
该模型是一个 POCO,其基本类型为 PersistentEntity
,它定义了一个名为 Created、Updated 和 Id 的属性。
Id 是 int,Created 和 Updated 是 DateTime。
我正在使用html.HiddenFor
在视图上创建隐藏字段。
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.Created)
@Html.HiddenFor(model => model.Updated)
在页面上,隐藏的输入被正确呈现,值中设置了 Id。
<input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="Id" name="Id" type="hidden" value="12">
但是,当页面提交到控制器 [HttpPost]Edit(Model model)
时,Id 属性始终为 0。Created 和 Updated 正确地填充了来自视图的值。
对于本文中的示例,这应该是 12。出了什么问题?
我知道我可以将方法签名更改为 [HttpPost]Edit(int personID, Person model)
,因为 personID 在 get 字符串中,但是为什么模型没有填充隐藏字段?
更新
问题是PersistentEntity
上的设置器受到保护,ASP 无法设置该属性,并吞下了它。将其更改为 public 已经解决了这个问题。
public abstract class PersistentEntity
public virtual int Id get; protected set;
public virtual DateTime Created get; set;
public virtual DateTime Updated get; set;
【问题讨论】:
这应该可以。你检查过你班级中 Id 的构造函数和属性设置器吗? 它对我有用,所以我们遗漏了一些未提及的东西 - 自定义活页夹、自定义 javascript 表单提交等...... 包含Id属性的模型类长什么样子? 我认为你是对的 - Id setter 受到保护。 ASP MVC 正在接受它无法设置Id
的事实。更改为不受保护的 setter 解决了这个问题。
@Macropus 感谢您在问题中添加的更新。这给了我一个线索,在我的情况下应该去哪里寻找。有点不幸的是,从外观上看,按照约定编程并不一定会给你很多跟踪信息、异常等来告诉你想要你做错了。
【参考方案1】:
public virtual int Id get; protected set;
protected set;
<!--
那是你的问题。如果您希望默认模型绑定器能够分配值,则需要 public setter。
【讨论】:
如果你正在查看这篇文章并且你的 POCO 上已经有一个公共设置器,你可能会发现这篇文章很有用:***.com/questions/3606087/…以上是关于MVC3 Html.HiddenFor(Model => Model.Id) 不传回控制器的主要内容,如果未能解决你的问题,请参考以下文章
Html.Hidden 和 Html.HiddenFor 有啥区别
请问在.net mvc3.0中,如何在action之间传递参数,切记不能在地址栏中看到