我使用脚手架代码创建了一个强类型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
上的setter是受保护的,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
的设置器被保护了。 ASP MVC 正在隐藏它无法设置Id
的事实。更改为非保护设置器解决了问题。 - Darbio