我使用脚手架代码创建了一个强类型的MVC3剃刀视图.
该模型是一种基本类型为PersistentEntity的POCO,它定义了一个名为Created,Updated和Id的属性.
Id是一个int,创建和更新是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.创建和更新已正确填充了来自View的值.
在这篇文章中,这个例子应该是12.出了什么问题?
我知道我可以将person签名变为[HttpPost] Edit(int personID,Person model),但是为什么模型没有被隐藏的字段填充?
更新
问题是在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; } }
解决方法
public virtual int Id { get; protected set; }
保护套<! - 这是你的问题.如果您希望默认模型binder能够分配该值,则需要一个公共设置器.