导航

 最近用ASP.net开发一个项目,想通过点击在Datagrid上的超级链接列访问该项的明细页面。比如下面:
 
 点击前面红色框中的链接就可以打开一个新窗口以查看明细。

但是我在属性生成器的超级链接列的“URL格式字符串”中输入从某书上粘来的类似下面的代码:

javascript:varwin=window.open('WebForm2.aspx?name={0}',null,'width=300,height=150');

弹出窗体倒是没有问题但是, “父”窗口WebForm1.aspx总是变成了一个空白页,显示 [object]  ,这可不符合设计要求了。如下:

遂去网上搜了半天,发现对此问题回答什么的都有,总结起来大致有如下几个:

1、代码改为:

javascript:varwin=window.open('WebForm2.aspx?pname={0}',null,'width=300,height=150');history.forward();

2、看出了WebForm1.aspx.cs中的代码有问题  
           private   void   Page_Load(object   sender,   System.EventArgs   e)  
                  {  
                               if  (!this.IsPostBack  )    
                                  this.BindData();      
                  }  
  就是这句,把if  (!this.IsPostBack  ) 去掉就可以 。原因分析为在单击DataGrid的超链接时,页面刷新了,这样IsPostBack=true,所以页面上就没有了数据。

3、只要在datagrid使用模板列,在模板列里添加Hyperlink控件,让Hyperlink控件Target属性为"_blank"。

后又发现网上造成这个问题的代码都是类似的,忽然发现一篇文章正常链接打不开用百度快照才看到文章的内容:

“下面的代码是页面内代码(.aspx),我发现有不少人问为什么新窗口弹出来后,原来的页面变成了只剩[Object]字样的空白页面,其实我先前也碰到了,而且很多老外也问同样的问题。原因是不知道大家最先都从哪里看到了一个最原始的代码..."javas cript:varwin=window.open...,这里的var和win之间要空一格!见下面:

弹出的页面一般是作为详细资料用的,可以用Session传递DataSet,就不熬述了。

[asp:HyperLinkColumn Text="详细" DataNavigateUrlField="CustNo" DataNavigateUrlFormatString="javascript:var win=window.open('Vip_CxCustDetail.aspx?CustNo={0}',null,'top=50,left=50,width=615,height=395');" DataTextField="CustNo" DataTextFormatString="详细"][/asp:HyperLinkColumn]”,
啊!我忽然觉得自己很傻,var在Javascript中声明一个变量,其实win只是一个变量名,改成其它也可比如newwin。所以正确的写法就是:

javascript:var newwin=window.open('WebForm2.aspx?name={0}',null,'width=300,height=150');


将var 和win中空一格即可,否则IE无法识别,等同于javascript:window.open(…)了。

我个人认为这是一个最好的解决方案,至于上面提到其它解决方案,我想第一个方案是较好的,比较简单,另外两个操作有些麻烦。

这个问题给我颇有些启示:不要忘记一些基本的东西,即便是Asp.net开发也还是会用到的。