MVC3 Html.HiddenFor(Model => Model.Id)未传回控制器

15

我使用脚手架代码创建了一个强类型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从视图中正确地填充了值。

enter image description here

在这篇文章的示例中,应该是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; }
}

1
这应该可以工作。你检查了类中Id的构造函数和属性设置器吗? - Dabblernl
1
它对我有效,因此我们缺少一些在问题中没有提到的东西 - 自定义绑定器、自定义JavaScript表单提交等等…… - Giedrius
1
模型类包含Id属性的样子是怎样的? - Darin Dimitrov
我认为你是对的 - Id 的设置器被保护了。 ASP MVC 正在隐藏它无法设置 Id 的事实。更改为非保护设置器解决了问题。 - Darbio
1
@Macropus 感谢您更新了您的问题。这给了我一个线索,在我的情况下可以寻找到答案。不幸的是,看起来按照惯例编程并不能为您提供很多跟踪信息、异常等来告诉您您做错了什么。 - Manfred
1个回答

16
public virtual int Id { get; protected set; }

protected set; <!-- 这就是你的问题。如果你想让默认的模型绑定器可以赋值,你需要一个公共的setter


1
如果您正在查看此帖子并且已经在您的POCO上拥有公共setter,您可能会发现这篇文章很有用:https://dev59.com/0XA65IYBdhLWcg3w1SXU - gbro3n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接