我在我的控制器中创建了一个强类型的表单:
返回视图(“BlaForm”,Bla);
在视图中我使用这样的东西:
(1)
<%= Model.Version %>
(2)
<%= Html.Hidden("Version", Model.Version)%>
这里(1)仅用于调试目的。
在我的对象连续更新之后,会生成如下内容:
(1)
10
(2)
<input id="Version" name="Version" type="hidden" value="9" />
由于一些奇怪的原因,隐藏的值不同步??? !!!在这种情况下,版本值肯定是10,由调试器建立。为什么是这样?隐藏的价值是以某种方式缓存的吗?
感谢。
基督教
PS:
我也这样做:
if (TempData["ViewData"] != null)
{
ViewData = TempData["ViewData"] as ViewDataDictionary;
}
在控制器操作中,以便在发生验证错误的情况下维护表单值。这似乎是原因。但我仍然明确地这样做:&lt;%= Html.Hidden(“Version”,Model.Version)%&gt; ...... ????也许我想念一下生命周期?
答案 0 :(得分:2)
Html帮助程序将始终在模型或ViewData中的值之前使用GET或POST请求中的值。这意味着如果您将Version=9
发布到控制器操作并在此操作中尝试将其值修改为10,则当您返回View时,Html.Hidden帮助程序将使用POSTed值而不是您的值模型。唯一的解决方法是自定义HTML帮助程序或简单地:
<input id="Version" name="Version" type="hidden" value="<%= Model.Version %>" />
答案 1 :(得分:0)
HTML帮助程序将始终在ModelStateDictionary中查找值,然后在ViewData中查找,之后使用给定为辅助方法的value参数。
另外两个地方就是你的情况。
ModelState state = this.ViewData.ModelState["Version"];
state.Value; // this is the value out of the ModelStateDictionary
object value = this.ViewData["Version"]; // this is the value if set
// out of the ViewData Collection
ModelStateDictionary获取其条目,同时进行模型绑定。如果您将Version作为操作方法参数,Modelbinder(在您的情况下为DefaultModelBinder)将输入带有get或post请求值的密钥版本。
如果您更改了值,请将其放入模型中,您还必须更新ModelStateDictionary。