【问题标题】:MVC3 Html.HiddenFor(Model => Model.Id) not passing back to ControllerMVC3 Html.HiddenFor(Model => Model.Id) 不传回控制器
【发布时间】: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 感谢您在问题中添加的更新。这给了我一个线索,在我的情况下应该去哪里寻找。有点不幸的是,从外观上看,按照约定编程并不一定会给你很多跟踪信息、异常等来告诉你想要你做错了。

标签: asp.net-mvc asp.net-mvc-3 view controller html-helper


【解决方案1】:
public virtual int Id { get; protected set; }

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

【讨论】:

猜你喜欢
  • 2015-01-31
  • 2014-12-23
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
相关资源
最近更新 更多