2

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

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

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

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

这不应该在文本框中仍然呈现 10 吗?

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

这是设计使然吗?

4

2 回答 2

4

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

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

于 2013-08-12T14:04:07.867 回答
1

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

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

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

于 2013-08-12T14:05:26.813 回答