MVC3 Html.HiddenFor(Model => Model.Id)没有传回Controller

Dar*_*bio 15 asp.net-mvc controller html-helper view asp.net-mvc-3

我使用脚手架代码创建了一个强类型的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)
Run Code Online (Sandbox Code Playgroud)

在页面上,正确呈现隐藏的输入,并在值中设置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">
Run Code Online (Sandbox Code Playgroud)

但是,当页面提交给控制器时[HttpPost]Edit(Model model),Id属性始终为0.已创建和更新已使用View中的值正确填充.

在此输入图像描述

对于这篇文章中的例子,这应该是12.出了什么问题?


我知道我可以将方法签名更改[HttpPost]Edit(int personID, Person model)为personID在get字符串中,但为什么模型没有填充隐藏字段?


更新

问题是setter on PersistentEntity受到保护,ASP无法设置属性,并吞下它.将此更改为公开已解决了该问题.

public abstract class PersistentEntity
{
    public virtual int Id { get; protected set; }
    public virtual DateTime Created { get; set; }
    public virtual DateTime Updated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 14

public virtual int Id { get; protected set; }
Run Code Online (Sandbox Code Playgroud)

protected set; <!--那是你的问题.如果希望默认模型绑定器能够分配值,则需要公共设置器.