隐藏的表单元素问题 - asp.net mvc

时间:2010-09-03 10:09:40

标签: asp.net-mvc asp.net-mvc-2

我在我的控制器中创建了一个强类型的表单:

返回视图(“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; ...... ????也许我想念一下生命周期?

2 个答案:

答案 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。