ASPxWebForm中OnClick事件无法获取控件文本问题求助
问题:Callback赋值后点击按钮无法获取TextBox文本
通过MyCallbackPanel.PerformCallback()触发回调,在MyCallbackPanel_Callback方法中成功为三个ReadOnly的ASPxTextBox赋值,但点击MyButton触发MyButton_Click时,获取到的TextBox文本始终为空。
前端代码
<dx:ASPxCallbackPanel runat="server" ID="MyCallbackPanel" ClientInstanceName="MyCallbackPanel" OnCallback="MyCallbackPanel_Callback"> <PanelCollection> <dx:PanelContent> <dx:ASPxPopupControl ClientInstanceName="MyPopup" ID="AggiungiServiziPopup" runat="server"> <ContentCollection> <dx:PopupControlContentControl runat="server"> <dx:ASPxFormLayout runat="server" ID="ASPxFormLayout1" Width="100%" ClientInstanceName="FormLayout_AggiungiServizi" Font-Bold="true"> <Items> <dx:LayoutItem Caption="This is an example" VerticalAlign="Middle"> <SpanRules> <dx:SpanRule ColumnSpan="1" RowSpan="1" BreakpointName="S"></dx:SpanRule> <dx:SpanRule ColumnSpan="2" RowSpan="1" BreakpointName="M"></dx:SpanRule> </SpanRules> <LayoutItemNestedControlCollection> <dx:LayoutItemNestedControlContainer> <dx:ASPxTextBox ID="Text1" runat="server" ReadOnly="true" Width="100%" /> </dx:LayoutItemNestedControlContainer> </LayoutItemNestedControlCollection> </dx:LayoutItem> <dx:LayoutItem Caption="This is an example" VerticalAlign="Middle"> <SpanRules> <dx:SpanRule ColumnSpan="1" RowSpan="1" BreakpointName="S"></dx:SpanRule> <dx:SpanRule ColumnSpan="2" RowSpan="1" BreakpointName="M"></dx:SpanRule> </SpanRules> <LayoutItemNestedControlCollection> <dx:LayoutItemNestedControlContainer> <dx:ASPxTextBox ID="Text2" runat="server" Width="100%" ReadOnly="true" BackColor="WhiteSmoke"/> </dx:LayoutItemNestedControlContainer> </LayoutItemNestedControlCollection> </dx:LayoutItem> <dx:LayoutItem Caption="This is an example" VerticalAlign="Middle"> <SpanRules> <dx:SpanRule ColumnSpan="1" RowSpan="1" BreakpointName="S"></dx:SpanRule> <dx:SpanRule ColumnSpan="2" RowSpan="1" BreakpointName="M"></dx:SpanRule> </SpanRules> <LayoutItemNestedControlCollection> <dx:LayoutItemNestedControlContainer> <dx:ASPxTextBox ID="Text3" runat="server" Width="100%" ReadOnly="true" BackColor="WhiteSmoke" /> </dx:LayoutItemNestedControlContainer> </LayoutItemNestedControlCollection> </dx:LayoutItem> </Items> </dx:ASPxFormLayout> <div class="rightButton"> <dx:ASPxButton runat="server" ID="MyButton" Text="Aggiorna" OnClick="MyButton_Click" AutoPostBack="false" /> </div> </dx:PopupControlContentControl> </ContentCollection> </dx:ASPxPopupControl> </dx:PanelContent> </PanelCollection> </dx:ASPxCallbackPanel>
后台代码
protected void MyCallbackPanel_Callback(object sender, CallbackEventArgsBase e) { Text1.Text = "foo"; Text2.Text = "bar"; Text3.Text = "hello"; } protected void MyButton_Click(object sender, EventArgs e){ string debug1 = Text1.Text; // 为空 string debug2 = Text2.Text; // 为空 string debug3 = Text3.Text; // 为空 }
原因及解决方法
核心原因
- ReadOnly控件的回发限制:ASP.NET WebForms中,标记为
ReadOnly="true"的输入控件默认不会将客户端值提交到服务器,框架认为用户无法修改这些值,因此忽略回发时的相关数据。 - Callback的值未持久化:Callback是局部回发,在
MyCallbackPanel_Callback中设置的TextBox值仅在当前Callback响应中渲染到客户端,但未保存到ViewState。后续按钮触发的回发(或回调)中,控件会从ViewState或初始状态重新加载,导致之前设置的值丢失。
解决方法
方法一:启用ReadOnly控件的回发提交
针对DevExpress的ASPxTextBox,添加SubmitReadOnlyValues="true"属性,让控件即使在ReadOnly状态下也会提交当前值到服务器:
<dx:ASPxTextBox ID="Text1" runat="server" ReadOnly="true" Width="100%" SubmitReadOnlyValues="true" /> <dx:ASPxTextBox ID="Text2" runat="server" Width="100%" ReadOnly="true" BackColor="WhiteSmoke" SubmitReadOnlyValues="true"/> <dx:ASPxTextBox ID="Text3" runat="server" Width="100%" ReadOnly="true" BackColor="WhiteSmoke" SubmitReadOnlyValues="true" />
修改后,按钮点击事件中就能直接获取到Callback中设置的文本值。
方法二:手动持久化值到ViewState
如果不想修改控件属性,可以在Callback中把值保存到ViewState,然后在页面加载时恢复:
protected void MyCallbackPanel_Callback(object sender, CallbackEventArgsBase e) { Text1.Text = "foo"; Text2.Text = "bar"; Text3.Text = "hello"; // 保存值到ViewState ViewState["Text1Value"] = Text1.Text; ViewState["Text2Value"] = Text2.Text; ViewState["Text3Value"] = Text3.Text; } protected void Page_Load(object sender, EventArgs e) { // 非首次加载时恢复值 if (IsPostBack || IsCallback) { Text1.Text = ViewState["Text1Value"]?.ToString() ?? string.Empty; Text2.Text = ViewState["Text2Value"]?.ToString() ?? string.Empty; Text3.Text = ViewState["Text3Value"]?.ToString() ?? string.Empty; } }
这样在按钮点击回发时,控件会从ViewState中读取之前保存的值,就能正常获取到文本。
内容的提问来源于stack exchange,提问作者ALX
相关产品推荐
相关产品推荐

