在我的页面上,我有一个占位符,当我在下拉列表中选择一个项目时,我会加载一个usercontrol。
protected void ddlLoadCtr_SelectedIndexChanged(object sender, EventArgs e)
{
Control userControl = LoadControl("../AleSettings1.ascx");
plchldSettingsControl.Controls.Add(userControl);
}
如果在呈现用户控件后按F5(IE),我会看到IE的警告窗口,IE需要重新发送信息....
我该如何预防呢?为什么会这样呢?
更新
也许有另一种方法? 当用户从下拉列表中选择时,我想加载特定的控件(带有它的标记) 如果进行了回发,则控件不应该消失(仅当从下拉列表中选择了另一个控件时)
一切都在更新面板内!
答案 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对控件的自动状态管理。