UpdatePanel.Update() 命令生成一个完整的Page_load

本文关键字:load 一个 Page 命令 Update UpdatePanel | 更新日期: 2023-09-27 18:32:29

我在网站的 2 个页面上使用的用户控件中有一个更新面板两个页面使用相同的母版页,脚本管理器在母版页中声明。两个页面都以相同的方式调用UC:

<uc:SearchCube runat="server" ID="searchCube" />

在"更新"面板中,我有许多单选按钮,它们在更改时会生成一个服务器端事件,该事件填充更新面板中的下拉列表并更新面板

protected void SearchCategoryChanged(object sender, EventArgs e)
{
    FillDropdowns();
    SearchOptions.Update();
}

更新面板设置如下:

<asp:UpdatePanel ID="SearchOptions" runat="server" UpdateMode="Conditional" 
hildrenAsTriggers="true"/>

每个单选按钮都设置如下:

<asp:RadioButton ID="RadioButton1" GroupName="SearchCategory" runat="server"
AutoPostBack="true" OnCheckedChanged="SearchCategoryChanged" Text="Text"/>

我在每个单选按钮控制器上也有一个AsyncPostBackTrigger

我遇到的问题是,当我调用Update()函数时,在一个页面上,面板会更新并触发Page_Load,这会导致 UC 刷新并重新加载 UC 的默认设置我可以在调试模式下看到,在工作页面上Update()不会生成Page_Load.

谁能向我解释为什么会发生这种情况?

UpdatePanel.Update() 命令生成一个完整的Page_load

每次请求转到服务器时,它都会执行Page_Load事件。
您需要做的是确保在所有页面上都有回发验证:

protectec void Page_Load(object sender, EventArgs e)
{
    if(!Page.IsPostBack)
    {
        //Not a postBack: Normal page load
        //Init your page here
    }
    else
    {
        //It's a PostBack (from a command).
        //Do nothing or init stuff your all your commands.
    }
}

如果在Page LoadSearchCategoryChanged方法中放置一些断点,您将能够看到管道的外观。

解决了我的问题。有问题的页面是一个包含一些参数的索引页面。我在页面上有一个 Response.Redirect() 以避免页面重复。显然,当 PostBack() 制作时,它会在没有任何参数的情况下调用页面,并且我强制将其重定向到默认视图中,因为没有参数发送到页面。

我在Microsoft帮助论坛中找到了我的问题的线索,上面写着:

通过直接调用 Response.Write(),您绕过了正常的 ASP.NET 控件的呈现机制。你写的位正在消失 直接发送给客户,无需进一步处理(嗯, 大多数情况下...这意味着UpdatePanel无法对其中的数据进行编码 特殊格式。

无论如何,页面每次都会重新加载,这导致它使用其默认值重新加载用户控件。

相关文章: