回发后保留下拉列表的选定值
Retain selectedvalue of dropdownlist after postback
我发现这个问题被问过无数次,但答案对我没有用:
我有一个从 asp:Objectdatasource
动态绑定的 asp:Dropdownlist
。按钮调用代码隐藏函数来存储所选值。但是,在单击事件函数中,下拉列表的值始终重置为默认值,据我所知,这是由于在单击事件处理程序之前调用的回发。调试时,我检查过 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
干杯!
编辑
前面问题的回复基本都是说把data binding放在Page_Init
方法或者Page_Load
方法中!IsPostBack
之后,对我没有帮助。
还有一个免责声明:这是一个包含大量代码的旧项目(相关代码是新的),但我试图删掉相关部分。据我所知,其余代码应该不会影响这一点,但我不能确定,因为我对 ASP.Net
还是很陌生
将您的 page_load 代码放入 page_Init 部分。 asp 生命周期将使下拉列表 databind() 绝对毫无意义,如果它位于此处的页面加载部分,因为回发会导致整个页面重新提交自身到 page_load 点,并且由于您有如果不是 ispostback 语句,它将重新加载页面结构,但不会 运行 您的页面加载代码,这就是您失去价值的地方。除此之外,代码很好。
我解决了它,正如已经指出的那样,发布的代码不完整:下拉菜单位于 JQuery-ui 对话框内,这使得下拉菜单失去了它的状态。我最终得到了一个带有 Javascript 函数的解决方法,该函数将所选值复制到对话框外的隐藏字段,并在代码隐藏
中使用隐藏字段值
我发现这个问题被问过无数次,但答案对我没有用:
我有一个从 asp:Objectdatasource
动态绑定的 asp:Dropdownlist
。按钮调用代码隐藏函数来存储所选值。但是,在单击事件函数中,下拉列表的值始终重置为默认值,据我所知,这是由于在单击事件处理程序之前调用的回发。调试时,我检查过 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
干杯!
编辑
前面问题的回复基本都是说把data binding放在Page_Init
方法或者Page_Load
方法中!IsPostBack
之后,对我没有帮助。
还有一个免责声明:这是一个包含大量代码的旧项目(相关代码是新的),但我试图删掉相关部分。据我所知,其余代码应该不会影响这一点,但我不能确定,因为我对 ASP.Net
还是很陌生将您的 page_load 代码放入 page_Init 部分。 asp 生命周期将使下拉列表 databind() 绝对毫无意义,如果它位于此处的页面加载部分,因为回发会导致整个页面重新提交自身到 page_load 点,并且由于您有如果不是 ispostback 语句,它将重新加载页面结构,但不会 运行 您的页面加载代码,这就是您失去价值的地方。除此之外,代码很好。
我解决了它,正如已经指出的那样,发布的代码不完整:下拉菜单位于 JQuery-ui 对话框内,这使得下拉菜单失去了它的状态。我最终得到了一个带有 Javascript 函数的解决方法,该函数将所选值复制到对话框外的隐藏字段,并在代码隐藏
中使用隐藏字段值