【问题标题】:Puzzling behavior of ASP.NET MVC appASP.NET MVC 应用程序的令人费解的行为
【发布时间】:2010-10-19 21:47:02
【问题描述】:

我的索引视图上有一个简单的搜索页面,其中包含一个下拉列表和一个文本框。我想记住用户对下拉列表的偏好,所以我将它存储在一个表中并根据需要检索它。这是控制器功能:

Function Index(ByVal lob As String, ByVal filter As String) As ActionResult
    If If(lob, "") = "" Then
        lob = GetUserPreferenceLob()
    End If
    ViewData("lob") = New SelectList(GetLobValues(), "Value", "Text", lob)
    ViewData("message") = lob
    Return View()
End Function

视图如下所示:

<% Using Html.BeginForm()%>
Line of Business:
<%=Html.DropDownList("lob", Nothing, New With {.onchange = "document.forms[0].submit()"})%>
Search:
<%=Html.TextBox("filter")%>
<img src="..." alt="Search" onclick="document.forms[0].submit()" />
<%=ViewData("message")%>
<% End Using%>

当我启动应用程序(这是默认页面)时,它成功加载列表并选择用户的项目。但是,如果我导航到该页面,例如通过页面上其他位置的链接,它会加载列表但默认选择第一项。我已经运行了调试器,它总是通过 Index 函数,根据“消息”输出,它总是传递要选择的正确值,那么为什么这种情况没有在列表中选择正确的条目呢?

更新:我在表单上还有其他数据,这些数据取决于从下拉列表中选择的值。通过链接导航到页面时,页面的其余部分的行为就像选择了适当的项目一样,但下拉菜单默认位于顶部。换句话说,如果我的下拉列表有值“A”、“B”和“C”,并且我选择“C”,然后单击重新加载页面的链接,下拉列表显示“A”,但其余部分该页面包含“C”的数据。

【问题讨论】:

  • 您是否检查以确保没有将多个项目设置为选中? (在您的 ViewData["lob"] 和实际的 html 源代码中)
  • 也许我遗漏了一些东西,但是数据是如何绑定到您的代码 sn-ps 中的。 "...DropDownList("lob", Nothing ..." 中的"Nothing",不应该是 DropDownList("lob", lob..." 其中 lob 是代码隐藏中的公共或受保护属性。
  • @James Avery - 当它正常工作时,适当的项目在标记中已选择="selected"。当我通过链接导航时,标记中没有选择任何项目,这就是它默认位于列表顶部的原因。
  • @Greg Ogle - 我正在使用辅助函数。通过将 ViewData 变量命名为与下拉列表相同,它将它们绑定。我尝试在“lob”之后取出其余的变量,但它仍然是相同的行为。
  • GetUserPreferenceLob 返回什么?如果没有用户登录会返回什么?

标签: asp.net-mvc html-helper


【解决方案1】:

您是否在点击页面链接后尝试刷新页面。它可能是本地缓存的版本。

【讨论】:

  • 它似乎与缓存没有任何关系。该页面永远不会在选择列表中的第一项的情况下呈现 - 为什么会有它的缓存版本?我还尝试从另一个 SO 线程添加所有缓存过期代码,它没有改变任何东西。
  • 只是检查更明显的可能性。
【解决方案2】:

可能是缓存...

查看此相关线程here(堆栈溢出)

【讨论】:

  • 我尝试实现缓存过期代码,但它没有改变任何东西。它似乎与缓存无关。
【解决方案3】:

我对 TextBoxes 有一个非常相似的问题:

在我的页面上,我使用 Html.TextBox("Attribute", Model.Attribute) 呈现一个文本框。用户在此文本框中输入一个值,然后按下一个按钮。在执行的代码中,我为模型的属性计算一个新值,然后再次渲染视图。 Html.TextBox("Attribute", Model.Attribute) 仍然显示用户输入的值,而 Html.Encode(Model.Attribute) 显示来自模型的正确值。

似乎 Html.TextBox 更喜欢显示用户输入的值,而不是模型中程序员修改的值。因此,Html.TextBox 似乎没有显示其第二个输入参数的值,而是显示 ViewData.ModelState["Atrribute"].Value.RawValue。

所以我只是在往返中更改视图状态和模型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 2020-06-19
    • 2023-03-12
    相关资源
    最近更新 更多