【问题标题】:Loading usercontrol on runtime and reloading the page在运行时加载用户控件并重新加载页面
【发布时间】:2011-06-05 23:22:48
【问题描述】:

在我的页面上,我有一个占位符,当我在下拉列表中选择一个项目时,我会在其中加载用户控件。

protected void ddlLoadCtr_SelectedIndexChanged(object sender, EventArgs e)
{
    Control userControl = LoadControl("../AleSettings1.ascx");      
    plchldSettingsControl.Controls.Add(userControl); 
}

如果在呈现用户控件后按 F5 (IE),我会收到 IE 的警告窗口,提示 IE 需要重新发送信息....
我该如何预防?为什么会这样?

更新:

也许还有另一种方法? 当用户从下拉列表中选择它时,我想加载特定的控件(带有它的标记)。
如果进行了回发,则控件不应消失(仅当从下拉列表中选择了另一个控件时)

一切都在更新面板中!

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    发生这种情况是因为当您进行刷新时,您会将最后一个请求重新发送到服务器。在这种情况下,更改下拉列表中的索引的事件。 你不能阻止浏览器询问

    【讨论】:

    • 所以我无能为力吗? (可能会将页面返回到初始状态)
    • 我不知道,这就是我问的原因。
    • 你不能阻止浏览器询问。每当用户在对服务器进行回发后点击刷新或 F5 时,都会发生这种情况。因此,防止的唯一方法是以不使用回发的方式开发您的应用程序。
    【解决方案2】:

    ASP.NET WebForms 使用“回发”。这意味着每当它处理“事件”时,例如在选择列表中选择一个项目,它都会向服务器发送一个 HTTP POST 以获取新的 HTML。

    这允许它在页面的不同版本之间保存状态,但意味着 F5 将是一个 POST,浏览器会警告你。

    解决此问题的方法是使用POST-then-REDIRECT 并自己处理控件的持久性。如果它只是一个控件,例如添加控件,可以通过查看Page_Load中的查询字符串来查看是否需要加载控件:

    protected void Page_Load(object sender, EventArgs e)
    {
      if Request.QueryString["ddlLoadCtr"] = "1":
        plchldSettingsControl.Controls.Add(LoadControl("../AleSettings1.ascx"));
    }
    

    然后重定向回页面而不是使用回发:

    protected void ddlLoadCtr_SelectedIndexChanged(object sender, EventArgs e)
    {
      var newUrl = Request.RawUrl + "?ddlLoadCtr=1";
      Response.Redirect(newUrl);
    }
    

    除了查询参数之外,保存状态的其他方法包括 cookie 和会话变量。这些具有不可收藏的缺点。

    无论如何,这意味着您无法使用 ASP.NET 的控件自动状态管理。

    【讨论】:

    • 这不是我想要的,当我按 F5 时我不想加载控件。此外,如果页面上的任何其他控件导致回发,它也不应该影响该控件(如果该控件已加载,请保留它)。如果我 Response.Redirect(newUrl);我所有的控件状态都消失了
    • 我解释了为什么控制状态消失了——使用重定向意味着你自己管理状态,否则它不是你想要的。这也意味着您在刷新时遇到浏览器警告。
    • 解决这个问题的唯一方法是使用GET而不是POST,这意味着在回发之后重定向。您可以使用其他方式手动保存状态,例如会话变量。一些缺点:无法将当前状态的页面添加为书签,并且很难同时在不同的标签页中打开两个这样的不同页面。
    猜你喜欢
    • 2016-08-18
    • 1970-01-01
    • 2014-01-08
    • 2018-02-22
    • 2022-01-09
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多