项目错误列表之二

    我遇到这样一个需求,在页面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页面明明白白写着:

< asp:TextBox  id ="ManagerId"  runat ="server"  Visible ="false" ></ asp:TextBox >

右键查看源代码,那个原本隐藏的控件却空了一行,页面根本就没有ManagerId这个东西。
好吧!我猜想<asp:TextBox Visible="false">的设定就是这样的。我换HTML标签<input type="hidden">:

< input  type ="hidden"  runat ="server"  style ="WIDTH:1px"  name ="ManagerId"   >

这回我看到了这个隐藏的对象,但它的id属性值为"_cm01"。
为什么?!为什么不是ManagerId?
问公司的前辈,他们解释说,.net下,当你没有给html标签设置id属性(你设置了name属性),它会自动为它生成一个id属性。如此,就产生了你碰到的问题。

建议:当你没有办法需要在aspx页面使用html标签时,记得给它的id和name属性都赋上值。这样的问题很浪费人时间。
-----------------------------------------------------------------------------------------
下面是一个很愚蠢的错误,很荣幸,我犯下了这个过错:

for ( int  i  =   0 ; i  <  dt.Rows.Count ; i ++ )
{
    DataRow row 
= dt.Rows[i];
    
if(row["ParentId"].ToString().Equals("aa"))
        dt.Rows.Remove(row);            
}


开始我写在foreach循环里,不过会报错,因为foreach的循环机制是——在循环之前将所有的元素加载进内存,然后按循序遍历,当你删除或添加元素,那么元素的次序已经发生了改变,循环就没有办法继续。
上面那个循环的作用是,当字段ParentId值为"aa"时,删除该行。
啊!你不觉得它有任何问题?谢谢你兄弟,你跟我是站一排的。
好吧!它的问题在于,当你删除了一行,还进行i++的操作话,那么跟在你删除的那行后的一样,将会漏过循环。这是很危险滴......
更正:

for ( int  i  =   0 ; i  <  dt.Rows.Count ;)
{
    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"。

你可能感兴趣的:(html,datagrid,server,asp,textbox,Hyperlink)