ASP.NET MVC应用程序的令人费解的行为

时间:2009-04-16 16:30:00

标签: asp.net-mvc html-helper

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

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

View看起来像这样:

<% 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函数,并且根据“message”输出它总是传递正确的值来选择,那么为什么那个场景没有在列表中选择正确的条目?

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

可能缓存......

查看此相关主题here(Stack Overflow)

答案 2 :(得分:0)

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

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

似乎Html.TextBox更喜欢显示用户输入的值而不是模型中程序员修改的值。因此,Html.TextBox似乎显示ViewData.ModelState [“Atrribute”]。Value.RawValue。

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