【问题标题】:Retain selectedvalue of dropdownlist after postback回发后保留下拉列表的选定值
【发布时间】:2026-02-08 01:20:06
【问题描述】:

我发现这个问题被问了无数次,但答案对我没有用:

我有一个从asp:Objectdatasource 动态绑定的asp:Dropdownlist。按钮调用代码隐藏函数来存储所选值。但是,在单击事件函数中,下拉列表的值始终重置为默认值,AFAIK 由于在单击事件处理程序之前调用的回发。调试时,我检查了 ViewStateMode 已启用并且 EnableViewState 为真。我已经被这个问题困扰了好几个小时了,有人知道吗?

ASPX 标记:

<asp:DropDownList runat="server" DataSourceID="AvailableNivamalerODS" ID="AddNivamalerDDL" />
<asp:ObjectDataSource runat="server" ID="AvailableNivamalerODS" TypeName="Nivamaler.NivamalerPresenter"
        SelectMethod="GetAvailableNivamalers"></asp:ObjectDataSource>
<asp:Button runat="server" 
    Text="Legg til" 
    OnClick="AddNivamalerToTjstpl" 
    ID="AddNivamalerBtn"
    UseSubmitBehavior="False"
    CssClass="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"/>

代码隐藏

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load

    If Not Page.IsPostBack Then
        AddNivamalerDDL.DataBind()
    End If
End Sub

点击事件处理程序:

Protected Sub AddNivamalerToTjstpl(sender As Object, e As EventArgs) Handles AddNivamalerBtn.Click
    Dim nivamalerId As Integer = AddNivamalerDDL.SelectedValue
    'Here nivamalerId is always the default value
End Sub

干杯!

编辑

上一个问题的回复基本上都说将数据绑定放在Page_Init方法或!IsPostBack之后的Page_Load方法中,这对我没有帮助。

还有一个免责声明:这是一个包含大量代码的遗留项目(相关代码是新的),但我试图剪掉相关部分。据我所知,其余代码不应该影响这一点,但我不能确定,因为我对 ASP.Net 还是很陌生

【问题讨论】:

  • 如果你已经看到这个问题被问了无数次,但答案对你没有用,你应该在你的问题中描述那些失败的答案。否则你很可能会再次得到许多相同的答案,这将浪费大家的时间。
  • 好点。他们通常说您必须在检查 Page_Load 中的 !IsPostBack 之后在 page_init og 中进行数据绑定,但我已经在这样做了。作为旁注,我注意到即使我没有在下拉列表中明确调用 DataBind() ,它也会正确绑定。另外,我找到了一种解决方案,建议您可以将值放入 Session 并在回发后选择它,但对我来说这感觉像是不好的做法......

标签: asp.net vb.net postback code-behind


【解决方案1】:

将您的 page_load 代码放入 page_Init 部分。 asp 生命周期将使下拉列表 databind() 如果它在此处的页面加载部分中是绝对没有意义的,因为 Postback 会导致整个页面重新提交到 page_load 点,并且由于您有 if not ispostback 语句,它将重新加载页面结构,但不会运行您的页面加载代码,这就是您失去价值的地方。除此之外,代码很好。

【讨论】:

  • 这并不能解决我的问题。下拉列表的 SelectedValue 仍然重置为点击事件处理程序中的默认值
  • 如果您将其移至 Init 部分,则不要使用 if not ispostback 语句进行数据绑定,因为没有意义。如果这不起作用,那么您的程序中的其他东西会导致您在这篇文章中没有提到的这个问题。如果下拉列表在没有调用 databind() 的情况下绑定,那么为什么您仍在尝试在后面的代码中使用它?您甚至在哪里分配下拉列表的 datatextfield 或 datavaluefield 属性? bc 如果你不分配任何东西,那么返回当然是默认值。
  • @grankdubya13 你是对的,有问题的代码没有发布。原来 JQuery-UI 对话框不能很好地与 ViewStates 配合使用。我还删除了显式数据绑定。感谢您的帮助!
  • 另外,我不知道这是否有帮助,但请检查将其放入 我最近遇到了维护值和尝试使用必须具有自动回发功能的按钮的问题运行他们的功能,但我不希望我的页面重新加载,直到我准备好实际点击提交按钮。我把我所有的页面都放在那个坏男孩里面,除了我的提交按钮,它就像一个魅力。每次我调用按钮的函数时,它都会阻止页面自行刷新,因此有助于维护我的视图状态。
  • 我试着把它放在一个 UpdatePanel 中,它本身没有任何效果,当我添加自动回发时,当面板刷新时,选定的值将重置,即选择一个值后一秒钟
【解决方案2】:

我解决了它,正如已经指出的那样,发布的代码不完整:下拉列表位于 JQuery-ui 对话框中,这使得下拉列表失去了状态。我最终找到了一个使用 Javascript 函数的解决方法,该函数将所选值复制到对话框外部的隐藏字段中,并在代码隐藏中使用隐藏字段值

【讨论】:

    最近更新 更多