C# 页面加载触发无限次

C# 页面加载触发无限次,c#,javascript,asp.net,iframe,C#,Javascript,Asp.net,Iframe,我的iframe asp.net页面有问题。 浏览器url包含我需要在iframe页面中使用的ST参数。 显然,我无法通过.NET访问,因此我想到在页面加载方法的末尾添加如下内容: protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { bool isReloaded = Request.QueryString.GetValue<boo

我的iframe asp.net页面有问题。 浏览器url包含我需要在iframe页面中使用的ST参数。 显然,我无法通过.NET访问,因此我想到在页面加载方法的末尾添加如下内容:

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());
            }
        }
    }
受保护的无效页面加载(对象发送方,事件参数e)
{
如果(!IsPostBack)
{
bool isReloaded=Request.QueryString.GetValue(“重新加载”);
ContentId=Request.QueryString.GetValue(“ContentId”);//我需要这个值
如果(!isReloaded)
{
StringBuilder js=新的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+”?重载=true&contentId='+last;”;
Append(“if(window.location.href.indexOf('reloadded=true')==-1)window.location.reload();”;
js.追加(“”);
Write(js.ToString());
}
}
}
在快捷方式中,我使用Javascript获取所需的值并激发reload(),但更改了QueryString

Page_Load再次启动,现在我的bool isReloaded中充满了true。 条件(!isReloaded)阻止这次javascript不会添加到响应中。 我不知道为什么,但是Page_Load再次启动,这次没有添加参数,所以情况与开始时相同,再次添加JS等

结果是页面加载无休止地激发。
我做错了什么?原因是什么?

如果您查看了代码,则有以下行:

js.Append("if(window.location.href.indexOf('reloaded=true') == -1) window.location.reload();");
您正在检查
location.href
中的'reload'变量,但请注意,您的页面会在更改位置后立即重新加载,并且脚本会在完成之前一直执行,因此会导致页面在没有查询字符串的情况下一次又一次地重新加载

拆下这根线,它应该可以正常工作

还有一件事,我稍微修改了你的代码,在页面上注册了脚本而不是响应

这不会有任何区别,但如果您的代码仍然不起作用,请尝试我的版本:

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);
    }
}
谢谢你的帮助。 现在我有了这样的东西,没关系

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>");
StringBuilder js=新的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.indexOf('reload=true')=-1)window.location.href=window.location.href+'?reload=true&contentId='+last;”;
js.追加(“”);
我不知道编辑位置会自动执行重新加载;)
再次感谢

您最初的要求是什么?这看起来可能是一个简单问题的混乱解决方案。我知道这看起来很混乱,但我正在某个更大的项目中使用Umbraco。我在想,也许在父页面中,我会用这个在代码隐藏中动态创建iframeparameter@usser3580824从没听说过翁布拉科。是不是通过解析代码来确保在困难的事情中解决简单的问题?有什么理由不说你想做什么吗?这将使它更容易帮助您-除此之外,它将始终重新运行该脚本,因为您没有进行回发-这里没有实际的惊喜。Umbraco是.NET的CMS。我们正在使用此CMS制作项目。这与这个具体问题无关。我不知道你想知道什么。在父页面中,我在url中有contentId。我需要这个值,但在iframe中,我无法使用请求属性获取它,所以我使用Javascript获取它(window.top.location),然后重新加载以触发相同的事件,但使用modify querystring,我同意香蕉的回答。您应该避免手动响应。如果可能,请编写脚本并使用ScriptManager执行此类任务。Webforms本身就很混乱。手工摆弄只会使Webforms的行为更加烦人