You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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; // 为空
}

原因及解决方法

核心原因

  1. ReadOnly控件的回发限制:ASP.NET WebForms中,标记为ReadOnly="true"的输入控件默认不会将客户端值提交到服务器,框架认为用户无法修改这些值,因此忽略回发时的相关数据。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:08:12