这是MVC模型绑定中的设计吗?

时间:2013-08-12 13:50:50

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

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

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

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

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

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

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

这是设计吗?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

如果您查看Html.TextBoxFor的源代码,您会看到如果ModelState中存在某个值,那么它将始终在任何其他值之前使用该值。

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

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