问题请看这里
MVC 相关源码片段:
string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string));
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue);
从这段代码中可以看到:MVC先从ModelState中获取表单字段值,在ModelState中不存在相关值的情况下才使用Controller传来的Model里的值。
微软为什么这样处理呢?
其实我也不知道,那我就大胆猜想下:
1. Form的值应该由用户提供,程序员是没权利修改的,只有在用户放弃提供值的情况下(如首次进入Edit界面),才允许Dev提供。
2. MVC在模型绑定过程中会进行数据验证,一方面:MVC得保证在数据验证失败情况下能够把错误数据显示出来(保存在ModelState中)。另一方面:Dev在Controller修改Form值是发生在数据验证成功之后,MVC不能保证Dev提供的值是否符合验证条件。
3. 原则上说表单显示的应该是用户输入的。