一个我以前从未见过的简单场景,但是一位同事刚刚出现 - MVC3
- 创建一个动作方法MyAction(int myProperty = 0)
- 创建具有属性MyProperty
的模型- 将此模型的实例传递给强类型视图,但在代码中将属性设置为10(不要使用查询字符串参数!)
- 在视图中,Html.TextBoxFor(x => x.MyProperty)
醇>
这应该在文本框中呈现10。
现在调用动作方法MyAction?myProperty = 8
这不应该在文本框中呈现10吗?
我看到我可以覆盖表达式发现的属性,并假设这是因为它们是相同的名称(Query String
参数和模型属性)。然后Eveything在ViewData
,但是一个覆盖另一个。
这是设计吗?
答案 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中,那么您在代码中设置的内容无关紧要。