0

我在我网站的 2 个页面上使用的用户控件中有一个更新面板两个页面都使用相同的 MasterPage,ScriptManger 在 MasterPage 中声明。两个页面都以相同的方式调用 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"/>

每个 RadioButton 的设置如下:

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

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

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

谁能向我解释为什么会这样?

4

2 回答 2

0

解决了我的问题。有问题的页面是一个包含一些参数的索引页面。我在页面上有一个 Response.Redirect() 以避免页面重复。显然,当 PostBack() 被调用时,它不带任何参数调用页面,我强迫它被重定向到默认视图,因为没有参数被发送到页面。

我在 Microsoft 帮助论坛中找到了导致我的问题的原因,该论坛指出:

通过直接调用 Response.Write() 可以绕过 ASP.NET 控件的正常呈现机制。您编写的位将直接发送给客户端,无需进一步处理(嗯,主要是......)。这意味着 UpdatePanel 不能以其特殊格式对数据进行编码。

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

于 2013-10-01T09:55:47.770 回答
0

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

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方法中放置一些断点,您将能够看到管道的样子。

于 2013-09-22T13:54:40.343 回答