session,寻找控件,验证,http处理
综合这两个必要条件,我们终于可以得出要让session_onend执行的充分条件了:
1)至少有一个request成功完整地执行
2)至少存储一些data在session state中。可以通过session变量或者加上session_onstart来实现。
4、简单的寻找固定的控件。
在页面的控件中按层次寻找控件很痛苦,但是如果你知道控件怎样固定在页面中,就可以用简写”$”来查找控件而不用写递归的代码。请看下面代码,注意”$”的使用:
1<form id="form1" runat="server" DefaultFocus="formVw$txtName">
2 <div>
3 <asp:FormView ID="formVw" runat="server">
4 <ItemTemplate>
5 Name:
6 <asp:TextBox ID="txtName" runat="server"
7 Text='<%# Eval("FirstName") + " " + Eval("LastName") %>' />
8 </ItemTemplate>
9 </asp:FormView>
10 </div>
11</form>
这个小技巧也可以用在服务器端的 使用FindControl()函数时:
1TextBox tb = this.FindControl("form1$formVw$txtName") as TextBox;
2if (tb != null)
3...{
4 //Access TextBox control
5}
7、Validation groups验证组
一个页中可能有多个控件和多个按钮。当其中的一个按钮被点击后想要特定的validator被激发而不是页面中的所有validator。在ASP.NET 1.1中除了hack code没有更好的办法。ASP.NET 2.0中给所有的validator控件和按钮(button、linkbutton等等)增加了ValidatorGroup属性,就可以轻松地解决这个问题。如果在页面中有一个TextBox并且紧挨着他有一个RequiredFieldValidator 和Button控件,可以将RequiredFieldValidator和Button的ValidationGroup属性设置成一样的值从而使得点击button时只触发这个RequiredFieldValidator的validor,任何没有定义在ValidationGroup内的其他的validator都会被忽略。看下例:
1<form id="form1" runat="server">
2 Search Text: <asp:TextBox ID="txtSearch" runat="server" />
3 <asp:RequiredFieldValidator ID="valSearch" runat="Server"
4 ControlToValidate="txtSearch" ValidationGroup="SearchGroup" />
5 <asp:Button ID="btnSearch" runat="server" Text="Search"
6 ValidationGroup="SearchGroup" /> .
7 Other controls with validators and buttons defined here
8</form>
在repeater或datelist中放一个BUTTON。再自定义它的ONCLICK的事件。到候台代码中直接写就可以了
所以对于 http://www.infotouch.cn/detail.aspx?id=120 这样的情况很容易处理,只要处理为 http://www.infotouch.cn/detail/120.aspx 即可。因为IIS根据*.aspx的扩展名将控制权交给了Asp.Net,进而转给了HttpModules。
如果请求的路径(path)没有扩展名,例如:http://www.infotouch.cn/detail 这样的路径。IIS首先检查该虚拟路径是否对应到一个本地目录,如果具有对应的本地目录,再查找该目录下是否具有缺省文件,如果找到,就重定向为该缺省文件的路径。否则,IIS报告一个Http404-文件未找到错误。