我使用脚手架代码创建了一个强类型的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被设置在该值中.
但是当页面提交给控制器[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能够分配该值,则需要一个公共设置器.