2010-09-03 45 views
0

我创建了一个强类型的形式,这样在我的控制器:隐藏的表单元素的问题 - asp.net的MVC

返回查看(“BlaForm”,BLA);

在视图我用的是这样的:

(1)

<%= Model.Version %> 

(2)

<%= Html.Hidden("Version", Model.Version)%> 

这里(1)仅用于调试目的。

我的对象的连续更新后这产生这样的事情:

(1)

(2)

<input id="Version" name="Version" type="hidden" value="9" /> 

隐藏的值是不同步的一些奇怪的原因??? !!!在这种情况下,调试器建立的版本值肯定是10。为什么是这样?以某种方式缓存隐藏值?

谢谢。

基督教

PS:

我也做:

if (TempData["ViewData"] != null) 
{ 
ViewData = TempData["ViewData"] as ViewDataDictionary; 
} 
控制器的操作来保持的情况下,验证错误的表单值

发生。这似乎是原因。但我仍然明确地这样做:<%= Html.Hidden(“Version”,Model.Version)%> .... ????也许我会错误地理解生命周期?

回答

2

Html助手将始终在模型或ViewData中的值之前使用GET或POST请求中的值。这意味着,如果您将Version=9发布到控制器操作并且在此操作中尝试将其值修改为10,那么当您返回视图时,Html.Hidden帮助程序将使用POSTed值而不是模型中的值。唯一的解决方法是一个自定义的HTML帮助或干脆:

<input id="Version" name="Version" type="hidden" value="<%= Model.Version %>" /> 
0

HTML助手总是会值ModelStateDictionary,然后在ViewData的并在此之后使用给定到辅助方法值参数。

另外两个地方在你的情况。

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获取其条目,而模型绑定。如果您将版本作为操作方法参数,则Modelbinder(在您的情况下为DefaultModelBinder)将输入提供值为get或post请求的密钥版本。

如果更改该值,将其放入模型中,则必须更新ModelStateDictionary。