Html.DisplayFor和Html.EditorFor显示不同的值

时间:2012-02-03 10:27:07

标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-routing html-helper

我完全难过了。
我在MVC2中做了一个搜索表(我在这个项目上做了很多其他人,一切正常。) Global.asax有这条路线:

  routes.MapRoute("OnlineHelpSearchIndex",
                          "Help/Search/{expression}/{page}",
                          new { controller = "OnlineHelp", action = "Search", expression = UrlParameter.Optional, page=1 });

表达式是base64编码的字符串。我在控制器中对其进行解码,将其传递给具有名为Expression的属性的模型,并将其显示在TextBox的PartialView中。 (然后,当用户单击链接或按Enter键时,我在javascript中对字符串进行编码并将其发送到"/Help/Search/"+value

我有几个以这种方式构建的搜索框(每个搜索框都有一条路由SomeModule/Search/{expression}),其中一个搜索框无效。

<%:Html.DisplayFor(m => m.Expression)%>
<%: Model.Expression %>
<%:Html.TextAreaFor(m => m.Expression)%>
<%:Html.TextBoxFor(m => m.Expression)%>
<%:Html.EditorFor(m => m.Expression)%>

前两个显示正确的表达式,其他三个显示网址中的表达。
我尝试将字符串硬编码到模型中,前两个显示硬编码字符串,其他三个显示网址中的内容。 怎么可能?
(我甚至尝试使用JS禁用,因此它是服务器端问题)

2 个答案:

答案 0 :(得分:1)

尝试更改expressionroutes.MapRoute控制器/操作方法中OnlineHelp/Search参数的名称

routes.MapRoute("OnlineHelpSearchIndex",
                          "Help/Search/{exprs}/{page}",
                          new { controller = "OnlineHelp", action = "Search", exprs = UrlParameter.Optional, page=1 });

(或者,如果您愿意,可以更改模型的Expression属性的名称)。

HtmlHelper具有一个或多个共享相同名称的属性时,通常会使用由TextBoxFor / EditorForViewModel方法创建的表单字段。 Router/Controller参数:您可以轻松查看生成的HTML代码,HtmlHelper方法创建的输入类型字段很可能会有id='Expression'属性导致整个问题

答案 1 :(得分:0)

我知道这是一个老线程,但我想我还是会回答它。发生这种情况的原因是有意的,这是由于ModelState。对于另一个案例,请参阅此问题 Asp.net MVC ModelState.Clear

简而言之,您将表单数据发布到控制器并返回View,并使用Helpers。因此,MVC假定这是验证失败并返回ModelState值,而不是Model数据的值。前两个正确显示,因为它们不是编辑器,其他3个是编辑器,因此它们显示的是ModelState。

在控制器中调用ModelState.Clear()将其吹走,或者实现其他设计模式,例如POST,Redirect,GET。