我遇到这样一个需求,在页面A上点一个链接,新开一个页面B,它包含一个列表(DataGrid),选择其中一条,关闭当前页面,回到前一个页面,并将我选择的信息带过去。实现很简单,但是我碰到一个让我郁闷了好久的小问题:
B页面的“选择”的模板列上,我是这样写的:
<ItemTemplate>
<asp:HyperLink id="Hyperlink1" runat="server" Text="选择"
NavigateUrl="<%#"javascript:opener.document.Form1.ManagerName.value='"
+ DataBinder.Eval(Container, "DataItem.username")+"' ;
opener.document.Form1.ManagerId.value='"+ DataBinder.Eval(Container, "DataItem.usercode")+"';
window.close();"%>">选择
</asp:HyperLink>
</ItemTemplate>
上面的代码的目的是将UserName和UserCode分别传递给前一个页面的ManagerName和ManagerId。
结果始终js报错:opener.document.Form1.ManagerId为空或不是对象
错误的意思很明白,但我很郁闷,因为我的A页面明明白白写着:
右键查看源代码,那个原本隐藏的控件却空了一行,页面根本就没有ManagerId这个东西。
好吧!我猜想<asp:TextBox Visible="false">的设定就是这样的。我换HTML标签<input type="hidden">:
这回我看到了这个隐藏的对象,但它的id属性值为"_cm01"。
为什么?!为什么不是ManagerId?
问公司的前辈,他们解释说,.net下,当你没有给html标签设置id属性(你设置了name属性),它会自动为它生成一个id属性。如此,就产生了你碰到的问题。
建议:当你没有办法需要在aspx页面使用html标签时,记得给它的id和name属性都赋上值。这样的问题很浪费人时间。
-----------------------------------------------------------------------------------------
下面是一个很愚蠢的错误,很荣幸,我犯下了这个过错:







开始我写在foreach循环里,不过会报错,因为foreach的循环机制是——在循环之前将所有的元素加载进内存,然后按循序遍历,当你删除或添加元素,那么元素的次序已经发生了改变,循环就没有办法继续。
上面那个循环的作用是,当字段ParentId值为"aa"时,删除该行。
啊!你不觉得它有任何问题?谢谢你兄弟,你跟我是站一排的。
好吧!它的问题在于,当你删除了一行,还进行i++的操作话,那么跟在你删除的那行后的一样,将会漏过循环。这是很危险滴......
更正:
{
DataRow row = dt.Rows[i];
if(row["ParentId"].ToString().Length > 0 || !row["ParentId"].ToString().Equals(""))
dt.Rows.Remove(row);
else
i++;
}
在这里列出来,即是对自己的一个警醒,也是对大家的一个提示。
------------------------------------------------------------------------------------------------
这是一个小小的发现,有时候,我们会在url里面传递一些参数,例如:
http://****.aspx?UserType=1
而如果你的页面有一个文本框的id也为"UserType"(假设你输入了2),当我们使用这种方式取值时:
Request.Param["UserType"],你将得到"1,2"。
而只有这样Request.QueryString["UserType"]才能得到"1"。