C# 页面加载触发无限次
我的iframe asp.net页面有问题。 浏览器url包含我需要在iframe页面中使用的ST参数。 显然,我无法通过.NET访问,因此我想到在页面加载方法的末尾添加如下内容: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
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的行为更加烦人