【问题标题】:Html.DisplayFor and Html.EditorFor displays different valuesHtml.DisplayFor 和 Html.EditorFor 显示不同的值
【发布时间】:2012-02-25 23:32:05
【问题描述】:

我完全被难住了。
我正在 MVC2 中做一个搜索表单(我已经在这个项目上做了十几个其他人,都工作正常。)
Global.asax 有这条路线:

  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}),但其中一个不工作。

<%: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,所以这是服务器端问题)

【问题讨论】:

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


    【解决方案1】:

    尝试在routes.MapRouteOnlineHelp/Search 控制器/操作方法中更改expression 参数的名称

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

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

    ViewModel 具有一个或多个与Router/Controller 参数同名的属性时,这通常会发生在由HtmlHelper 方法(例如TextBoxFor/EditorFor)创建的表单字段中:您可以通过查看生成的 HTML 代码轻松检查这一点,HtmlHelper 方法创建的输入类型字段很可能具有导致整个问题的 id='Expression' 属性。

    【讨论】:

    • 你说其中一个不工作,对吧?您提到的情况按预期工作:Html.DisplayForModel.Expression 不产生输入类型字段,因此它们不会受到影响/覆盖,其他三种情况会。
    • 不,我的意思是 &lt;%:Html.TextBoxFor(m =&gt; m.Expression)%&gt; 除了两个地方以外都可以工作。
    • 我还需要查看其余代码:我只能说,鉴于您的示例,由于上述原因,我得到了相同的结果。为了更好地理解您的具体问题,我建议在控制器的方法中设置一个断点并在 ModelState 内观察:您应该看到最有可能影响您的 TextBoxFor(s) 的操作参数。在将模型返回到视图之前,您还可以全部删除它们(Modelstate.Clear())或有选择地删除它们(各种keys),但如果您需要在同一个请求中执行验证检查,您通常不希望这样做。
    • 说实话,我一个多星期前就厌倦了这个问题,写了&lt;input type="text" id="Expression" value="&lt;%:Model.Expression%&gt;" /&gt;
    【解决方案2】:

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

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

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

    【讨论】:

    • 只有 1 票不足以回答这个问题。为了解决这个问题,我度过了一个不眠之夜!谢谢你,迈克。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多