【问题标题】:Is this by design in MVC Model Binding?这是 MVC 模型绑定中的设计吗?
【发布时间】:2013-08-12 13:50:49
【问题描述】:

一个我从未见过的简单场景,但一位同事刚刚击中 - MVC3

  1. 创建动作方法 MyAction(int myProperty = 0)
  2. 创建一个具有 MyProperty 属性的模型
  3. 将此模型的实例传递给强类型视图,但在代码中将属性设置为 10(不要使用查询字符串参数!)
  4. 在视图中,Html.TextBoxFor(x => x.MyProperty)

这应该在文本框中呈现 10。

现在调用动作方法 MyAction?myProperty=8

这不应该还是在文本框中呈现 10 吗?

我看到我可以覆盖表达式发现的属性并假设这是因为它们是相同的名称(Query String 参数和模型属性)。然后一切都在ViewData 中,但其中一个会覆盖另一个。

这是设计的吗?

【问题讨论】:

  • 这实际上是关于模型绑定,而不是 Razor。
  • 你是@Html.TextBoxFor 之间的一个form using 语句。

标签: asp.net-mvc asp.net-mvc-3 razor


【解决方案1】:

这是设计使然 - ModelState 是模型属性的最高优先级价值提供者,甚至高于模型本身。如果没有查询字符串参数,ModelState 不包含MyProperty 的值,因此框架使用模型值。

您可以使用ModelState.Remove("MyProperty")来确保使用模型值

【讨论】:

  • 谢谢 - 以前从未见过这个,所以我(再次)学到了一些新东西。
  • 或者重命名url参数(动作参数)。
【解决方案2】:

如果您查看Html.TextBoxFor 的源代码,您会发现如果ModelState 中存在一个值,那么它将始终先使用该值。

string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string));
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue);

如果该值在 ModelState 中,那么您在代码中设置的内容无关紧要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2012-07-27
    • 2014-07-21
    相关资源
    最近更新 更多