我使用脚手架代码创建了一个强类型的MVC3 Razor视图。
该模型是一个基础类型为PersistentEntity
的POCO,它定义了一个名为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.已创建和更新已使用视图中的值正确填充。
在这篇文章的例子中,这应该是12。出了什么问题?
我知道我可以将方法签名更改为[HttpPost]Edit(int personID, Person model)
,因为personID在get字符串中,但为什么模型没有填充隐藏字段?
更新
问题是PersistentEntity
上的setter受到保护,ASP无法设置属性,并吞下它。将此更改为公开已解决了这个问题。
public abstract class PersistentEntity
{
public virtual int Id { get; protected set; }
public virtual DateTime Created { get; set; }
public virtual DateTime Updated { get; set; }
}
答案 0 :(得分:14)
public virtual int Id { get; protected set; }
protected set;
<!--
这是你的问题。如果您希望默认模型绑定器能够分配值,则需要公共设置器。