2012-02-03 145 views
3

我完全难住了。
我在MVC2做searchform(我已经在这个项目上,一切工作正常进行十余人。)
Global.asax中有这条路线:Html.DisplayFor和Html.EditorFor显示不同的值

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

的表达是一个base64编码字符串。我在控制器中解码它,将它传递给一个名为Expression的属性的模型,并将其显示在TextBox中的PartialView中。 (然后,当用户点击一个链接或按下回车,我编码字符串中的javascript并将其发送到"/Help/Search/"+value

我已经建立了这种方式(每一个路线SomeModule/Search/{expression}),其中一个几个searchboxes不工作。

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

前两个显示正确的表达式,另外三个显示url中的表达式。
我试图硬编码一个字符串到模型中,前两个显示硬编码的字符串,其他三个显示在URL中的任何内容。 这怎么可能?
(我甚至试图与JS禁用,所以它是一个服务器端的问题)

回答

1

试图改变名称中都routes.MapRoute并在OnlineHelp/Search控制器/操作方法expression参数

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

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

这种情况经常发生与HtmlHelper方法,如TextBoxFor/EditorFor,当ViewModel具有共享Router/Controller参数同名的一个或多个属性创建表单字段工作:您可以轻松地检查这个看着生成的HTML代码,由HtmlHelper方法创建的输入类型字段最有可能具有导致整个问题的id='Expression'属性。

+0

但是,为什么它适用于除我的两个案件之外的所有案件? – TDaver 2012-02-26 09:05:25

+0

你说*他们中的一个*不工作,对吧?你提到的情况正如预期的那样工作:'Html.DisplayFor'和'Model.Expression'不会产生一个输入类型的字段,所以它们不会被影响/覆盖,其他三种情况。 – Darkseal 2012-02-26 11:24:44

+0

不,我的意思是'<%:Html.TextBoxFor(m => m。表达式)%>'在两个地方都可以工作。 – TDaver 2012-02-26 13:29:50

0

我知道这是一个旧线程,但我想我会回答它。这是发生的原因是故意的,这是由于ModelState。看到这个问题的另一种情况: Asp.net MVC ModelState.Clear

长话短说,你正在发布表单数据到控制器并返回一个视图,并使用助手。因此,MVC假定这是验证失败并返回ModelState值,而不是模型数据的值。前两个显示正确,因为它们不是编辑器,其他3个是编辑器,所以它们显示ModelState。

要么在控制器中调用ModelState.Clear()以将其吹掉,要么实现另一种设计模式,例如POST,Redirect,GET。

相关问题