Page_Load激发无限次

时间:2014-07-03 12:54:36

标签: c# javascript asp.net iframe

我的iframe asp.net页面有问题。 浏览器网址包含我需要在iframe页面中使用的参数。 显然我无法通过.NET访问,所以我想到了在Page_Load方法的末尾添加类似的东西:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            bool isReloaded = Request.QueryString.GetValue<bool>("reloaded");
            ContentId = Request.QueryString.GetValue<int>("contentId"); //I need this value
            if (!isReloaded)
            {
                StringBuilder js = new StringBuilder("<script language='javascript'>");
                js.Append("var last = window.top.location.href.substring(window.top.location.href.lastIndexOf('/') + 1, window.top.location.href.length); ");
                js.Append("window.location.href = window.location.href + '?reloaded=true&contentId=' + last;");
                js.Append("if(window.location.href.indexOf('reloaded=true') == -1) window.location.reload();");
                js.Append("<" + "/script>");
                Response.Write(js.ToString());
            }
        }
    }

在快捷方式中,我使用Javascript来获取我需要的值并使用更改的QueryString来激活reload()。

Page_Load再次开火,现在我已经将bool isReloaded填充为true。 条件(!isReloaded)阻止了这次javascript不会被添加到Response。 我不知道为什么,但是Page_Load再次触发,这次没有添加参数,所以它与开始时的情况相同,并且再次添加JS等。

结果是Page_load无休止地激发。 我做错了什么 ?是什么原因?

2 个答案:

答案 0 :(得分:1)

如果您查看代码,可以使用以下代码:

js.Append("if(window.location.href.indexOf('reloaded=true') == -1) window.location.reload();");

您正在检查location.href是否已重新加载&#39; var,但请注意,一旦更改位置就会重新加载页面,并且脚本在完成之前会一直执行,因此会导致重新加载页面而不会使用查询字符串。

删除此行,它应该可以正常工作。

另一件事,我改变你的代码一点点在页面上注册脚本而不是response.write它,

它不应该有任何区别,但是如果你的代码仍然无效,那么试试我的版本:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        bool isReloaded;
        int ContentId;
        bool.TryParse(Request.QueryString["reloaded"],out isReloaded);
        int.TryParse(Request.QueryString["contentId"],out ContentId); //I need this value
        if (!isReloaded)
        {
            StringBuilder js = new StringBuilder();
            js.Append("var last = window.top.location.href.substring(window.top.location.href.lastIndexOf('/') + 1, window.top.location.href.length); ");
            js.Append("window.location.href = window.location.href + '?reloaded=true&contentId=' + last;");
            ExecScript(js.ToString());
        }
    }
}
void ExecScript(string script)
{
    Page page = HttpContext.Current.CurrentHandler as Page;
    if (page != null && !page.ClientScript.IsClientScriptBlockRegistered("AttachedScript"))
    {
        page.ClientScript.RegisterClientScriptBlock(page.GetType(), "AttachedScript", script, true);
    }
}

答案 1 :(得分:0)

感谢您的帮助。 现在我有这样的感觉,没关系。

StringBuilder js = new StringBuilder("<script language='javascript'>");
js.Append("var last = window.top.location.href.substring(window.top.location.href.lastIndexOf('/') + 1, window.top.location.href.length); ");
js.Append("if(window.location.href.indexOf('reloaded=true') == -1) window.location.href = window.location.href + '?reloaded=true&contentId=' + last;");
js.Append("<" + "/script>");

我不知道编辑位置会自动执行重新加载;) 再次感谢