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

Posted

技术标签:

【中文标题】MVC3 Html.HiddenFor(Model => Model.Id) 不传回控制器【英文标题】:MVC3 Html.HiddenFor(Model => Model.Id) not passing back to Controller 【发布时间】:2011-09-26 10:04:32 【问题描述】:

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

对于本文中的示例,这应该是 12。出了什么问题?


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


更新

问题是PersistentEntity 上的设置器受到保护,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; 

【问题讨论】:

这应该可以。你检查过你班级中 Id 的构造函数和属性设置器吗? 它对我有用,所以我们遗漏了一些未提及的东西 - 自定义活页夹、自定义 javascript 表单提交等...... 包含Id属性的模型类长什么样子? 我认为你是对的 - Id setter 受到保护。 ASP MVC 正在接受它无法设置Id 的事实。更改为不受保护的 setter 解决了这个问题。 @Macropus 感谢您在问题中添加的更新。这给了我一个线索,在我的情况下应该去哪里寻找。有点不幸的是,从外观上看,按照约定编程并不一定会给你很多跟踪信息、异常等来告诉你想要你做错了。 【参考方案1】:
public virtual int Id  get; protected set; 

protected set; &lt;!-- 那是你的问题。如果您希望默认模型绑定器能够分配值,则需要 public setter

【讨论】:

如果你正在查看这篇文章并且你的 POCO 上已经有一个公共设置器,你可能会发现这篇文章很有用:***.com/questions/3606087/…

以上是关于MVC3 Html.HiddenFor(Model => Model.Id) 不传回控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何在Razor中设置隐藏值

Html.HiddenFor 做啥?

Html.Hidden 和 Html.HiddenFor 有啥区别

请问在.net mvc3.0中,如何在action之间传递参数,切记不能在地址栏中看到

@Html.HiddenFor 不适用于 ASP.NET MVC 中的列表

ViewModel在MVC3中的应用:一个view显示多个model