我完全难过了。
我在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禁用,因此它是服务器端问题)
答案 0 :(得分:1)
尝试更改expression
和routes.MapRoute
控制器/操作方法中OnlineHelp/Search
参数的名称:
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'
属性导致整个问题
答案 1 :(得分:0)
我知道这是一个老线程,但我想我还是会回答它。发生这种情况的原因是有意的,这是由于ModelState。对于另一个案例,请参阅此问题 Asp.net MVC ModelState.Clear
简而言之,您将表单数据发布到控制器并返回View,并使用Helpers。因此,MVC假定这是验证失败并返回ModelState值,而不是Model数据的值。前两个正确显示,因为它们不是编辑器,其他3个是编辑器,因此它们显示的是ModelState。
在控制器中调用ModelState.Clear()将其吹走,或者实现其他设计模式,例如POST,Redirect,GET。