【发布时间】: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 感谢您在问题中添加的更新。这给了我一个线索,在我的情况下应该去哪里寻找。有点不幸的是,从外观上看,按照约定编程并不一定会给你很多跟踪信息、异常等来告诉你想要你做错了。
标签: asp.net-mvc asp.net-mvc-3 view controller html-helper