众所周知,Response.Redirect打开页面时,会覆盖当前页面。现在想打开一个新页面,当前页面不变。于是用了如下代码:
Response.Write("<script language=JavaScript>window.open('"+ strUrl +"' ,'_blank','');</script>");
现在的确可以弹出新页面了.但是不知为何,当前页面的CSS丢失了.在未点击Preview按钮前,页面的排版如下:
字体都比较小,也比较漂亮一点.点击Preview按钮后,的确打开了新页面,但当前页面变成如下效果:
相比上一幅图,可以看到字体明显变大.
为什么会这样呢?
如何打开新页面又不影响当前页面的css设置呢?
历尽千辛万苦,终于找到一篇文章:http://stackoverflow.com/questions/104601/asp-net-response-redirect-to-new-window
据说在此按钮中加上此句,即可:
OnClientClick="aspnetForm.target ='_blank';"
经试验,果然成功.当前页面的css正常,不会改变.不过由于页面还有其他按钮,而其他按钮的click是不应该打开新页面的.那么我们可以这样做:
<script type="text/javascript">
functionfixform() {
if(opener.document.getElementByIdx_xx_x_x("aspnetForm").target !="_blank")return;
opener.document.getElementByIdx_xx_x_x("aspnetForm").target ="";
opener.document.getElementByIdx_xx_x_x("aspnetForm").action = opener.location.href;
}
</script>
还要加上
<body onload="fixform()">
而我用的是Master和Content模式,首先报错:
去掉opener之后,还是老问题,所有的按钮都会弹出新页面.没办法,转战其他方法.只好采用扩展方法,给Response.Redirect重写了一下,如下:
publicstaticclassResponseHelper
{
publicstaticvoidRedirect(thisHttpResponse response,stringurl,stringtarget,stringwindowFeatures)
{
if((String.IsNullOrEmpty(target) || target.Equals("_self", StringComparison.OrdinalIgnoreCase)) && String.IsNullOrEmpty(windowFeatures))
{
response.Redirect(url);
}
else
{
Page page = (Page)HttpContext.Current.Handler;
if(page ==null)
{
thrownewInvalidOperationException("Cannot redirect to new window outside Page context.");
}
url = page.ResolveClientUrl(url);
stringscript;
if(!String.IsNullOrEmpty(windowFeatures))
{
script =@"window.open(""{0}"", ""{1}"", ""{2}"");";
}
else
{
script =@"window.open(""{0}"", ""{1}"");";
}
script = String.Format(script, url, target, windowFeatures);
ScriptManager.RegisterStartupScript(page,typeof(Page),"Redirect", script,true);
}
}
}
调用时这样写就可以
Response.Redirect(redirectURL,"_blank","menubar=0,scrollbars=1,width=780,height=900,top=10");
但扩展方法是.NET 3.5才有的特性,而客户的服务器仅支持.NET2.0。而且我也不愿意污染Response.Redirect方法。再次修改代码如下:
protectedvoidbtn_preview_Click(objectsender, EventArgs e)
{
m_currentPage = Pageaspacim.Base;
if(m_currentPage.genPreviewPages())
{
String scriptName ="previewClickScript";
Type clientScriptType =this.GetType();
// Get a ClientScriptManager reference from the Page class.
ClientScriptManager clientScript = Page.ClientScript;
// Check to see if the client script is already registered.
if(!clientScript.IsClientScriptBlockRegistered(clientScriptType, scriptName))
{
StringBuilder sb =newStringBuilder();
sb.Append("<script type='text/javascript'>");
sb.Append("window.open(' "+ URL +"')");//URL = where you want to redirect.
sb.Append("</script>");
clientScript.RegisterClientScriptBlock(clientScriptType, scriptName, sb.ToString());
}
}
}终于。。。。终于。。。。成功啦!!!泪奔!!!
这次的难点是在Page点击某个Button后,要去后台cs那里保存当前页面的所有控件的值到数据库中(也就是说如果用AJAX,就要传递此页面所有控件的值到后台。如果仅仅有两三个控件,传值到后台当然没问题。但如果此页面上有很多控件呢?那光传值这个动作就要把人累死啦。所以用AJAX就不是太合适。),在后台保存完数据后,要打开一个新页面。Response.Redirect只能覆盖当前页面,用Response.Write(“<script>window.open(‘’)</script>”)方法能打开新页面,但是当前页面的css就无效了(不知道原因)。
而且我要求每次点击按钮,都要调用后台函数并打开新页面。(不是在Page.Load那里注册一次就完了。而且我要打开的页面地址也是动态生成的,在Page.Load的时候还拿不到这个地址。)
所以才有了这篇文章的出现。希望能帮到和我有同样困扰的童靴。