在运行时加载usercontrol并重新加载页面

时间:2011-01-29 20:53:02

标签: c# asp.net

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

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

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

更新

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

一切都在更新面板内!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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对控件的自动状态管理。