一些简单的ASP.NET 2.0技巧(转)
1、在CallBack之后保持滚动条的位置
在Asp.Net1.1中,CallBack之后保持滚动条的位置是一件非常痛苦的事情,特别是页中有一个Grid并且想要编辑特定的行。为了不停留在想 要得行,页面会重新加载并且必须在顶部向下滚动。在Asp2.0中,只需要简单的在页面的属性中加入
MaintainScrollPostionOnPostBack属性即可:
2、页面加载后设置默认焦点到控件上
这也是一个非常简单的例子,不需要javascript的辅助即可完成。如果在页面中有一两个textbox,为什么要让用户去点击textbox来开始 输入数据呢?是不是可以能够让光标已经停留在textbox进而可以输入数据呢?使用HtmlForm控件的DefaultFocus属性就可以轻易的做 到:
<form id="frm" DefaultFocus="txtUserName"
runat="server">
</form>
3、用户点击“Enter”键时触发默认按钮的click实践。
在Asp1.1中,想要使用户点击“Enter”键就能关联到一个button的服务器段的click事件需要借助于javascript,这是很痛苦 的。幸好,现在可你使用HtmlForm控件的DefaultButton属性来设置。这个属性也可以设置到Panel控件上,当用户移动到页面中不同的 Panel上,点击enter键来触发不同的button控件的click事件。
<form id="frm" DefaultButton="btnSubmit"
runat="server">
</form>
4、简单的寻找固定的控件。
在页面的控件中按层次寻找控件很痛苦,但是如果你知道控件怎样固定在页面中,就可以用简写”$”来查找控件而不用写递归的代码。请看下面代码,注意”$”的使用:
<form id="form1" runat="server"
DefaultFocus="formVw$txtName">
<div>
<asp:FormView ID="formVw"
runat="server">
<ItemTemplate>
Name:
<asp:TextBox ID="txtName" runat="server"
Text='<%# Eval("FirstName") + " " +
Eval("LastName") %>' />
</ItemTemplate>
</asp:FormView>
</div>
</form>
这个小技巧也可以用在服务器端的使用FindControl()函数时:
TextBox tb = this.FindControl("form1$formVw$txtName") as TextBox;
if (tb != null)
{
//Access TextBox control
}
5、强类型访问跨页提交的控件
这个比其他的要内容多一点,但是很有用。ASP.NET 2.0引入了交叉回发的概念使得一个页面可以将信息回发到另一个不同的页面,可以将button控件的PostBackUrl属性设置为接受回发数据的页 面来完成。一般的,回发的数据可以象前一页那样做一些事情。但是,如果你要获得前一页制定控件的属性就需要一个cast(),如果你给引起回发的code -behide页面添加了一个公共属性,你就可以直接以强类型的方式添加PreviousPageType来指向引起回发的页面从而能够访问那个属性。
如果有一个页面Default.aspx,他有一个公共属性来返回此页面上一个TextBox,数据回发目的页(SearchResults.aspx)可以以强类型的方式(不需要FindControl() 方法),在页面的顶部添加:
<%@ PreviousPageType VirtualPath="Default.aspx" %>
这样,SearchResults.aspx中代码就可以以强类型的方式访问Default.aspx的TextBox。下面的例子假定Default.aspx定义的属性名为SearchTextBox:
TextBox tb = PreviousPage.SearchTextBox; PreviousPageType还有一个TypeName属性,你可以定义一个基本类型,一个或多个页面从此类型继承下来,使得这种技术可以在多页面上 使用。PreviousPage.IsCrossPagePostBack可以判断是否为垮页提交。
对于跨页提交的补充:
在ASP.NET 1.X 版本中,页面都是提交到自己本身,并不能方便的指定需要提交的目的页面。例如FirstPage.aspx中的button只能提交到 FirstPage.aspx,而不能提交到SecondPage.aspx。很多时候,ASP.NET 1.X这样工作方式使我们的开发方式受到不少限制。熟悉ASP/JSP/PHP的朋友大概很不习惯,因为以前经常使用的提交方式突然无法使用,虽然也有解
决这个问题的方法(欲详细了解的读者可去微软网站收看webcast),可是过程太烦琐,不甚方便。令我们高兴的是,ASP.NET 2.0中有了跨页面提交的简单方法。可在第一个页面中的button添加PostBackUrl属性设置为接受提交的页面,并且这个页面增加
PreviousPageType 指令,若要是目标页面在新窗口中打开则可以在源页面<form>标记增加target=’_blank’属性。
<%@ Page Language="C#"
MaintainScrollPositionOnPostback="true" AutoEventWireup="true"
CodeFile="" Inherits="" %>
6、强类型访问母版页的控件
PreviousPageType指令并不是唯一的可以强类型访问控件的方法。如果在母版页中定义了一个公共属性,并且想要以强类型的方式访问它,那么就
可以在页面顶部添加MasterType指令(注意:MasterType指令同PreviousPageType一样允许定义一个TypeName)
<%@ MasterType VirtualPath="MasterPage.master" %>
你可以在内容页书写如下的代码来访问目标母版页的属性:
this.Master.HeaderText = "Label updated using MasterType directive with
VirtualPath attribute.";
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都会被忽略。看下例:
<form id="form1" runat="server">
Search Text: <asp:TextBox ID="txtSearch"
runat="server" />
<asp:RequiredFieldValidator ID="valSearch"
runat="Server"
ControlToValidate="txtSearch"
ValidationGroup="SearchGroup" />
<asp:Button ID="btnSearch"
runat="server" Text="Search"
ValidationGroup="SearchGroup"
/> .
Other controls with validators and
buttons defined here
</form>
一、在一个Repeater控件的Item中加入了<span>如何在后台cs代码中获取到该控件呢?
1、<span class="col"
runat="server" id="spanLanguage"><%#Eval("Language") %></span>,虽把该span设为runat = server.
2、获取该控件System.Web.UI.HtmlControls.HtmlContainerControl spanControl
=repLanguage.Items[i].FindControl("spanLanguage")as
System.Web.UI.HtmlControls.HtmlContainerControl;
spanControl.InnerText
= “aaaa”;
二、什么时候要用<%#Eval?
只有在控件中,它有bind()事件才有用,没有bind()事件的用<%=%>
三、在Repeater中加入删除功能
可以在Repeater的ItemTemplate中加入linkButton控件:
1、
在ItemTemplate中加入<span class="col"><asp:LinkButton ID="LinkButton1" CausesValidation="false" OnClientClick="return confirm('Are you sure you want to delete this
language?');" CommandArgument=<%#Eval("MemberLanguageProficiencyID")%> runat=server CommandName="delete">delete</asp:LinkButton></span></li>
2、
在Repeater事件中加入OnItemCommand="repLanguage_ItemCommand"
3、
在后台的cs中加入:
protected void
repLanguage_ItemCommand(object source, RepeaterCommandEventArgs e)
{
//Delete
languages
if
(e.CommandName != "" &&
e.CommandArgument != null)
{
IMeet.Entities.MemberLanguageProficiencyVO languabe = new IMeet.Entities.MemberLanguageProficiencyVO();
if
(e.CommandName.ToLower().Trim() == "delete")
{
Do some thing…
}
}
}
四、获取DataGrid或者Repeater控件目前所在行的行数
Container.ItemIndex
五、如何在后台控制前台的元素
<li class=<%#SetColor(Container.ItemIndex)%> >
SetColor是后台的一个protected方法。因为在Repeater控件里所以需要使用<%#。
六、Repeater绑定多个参数
CommandArgument='<%#Eval("IMeetMemberProfileID").ToString()+"-"+Eval("IsAdmin").ToString()+"-"+Eval("UserID").ToString()
%>'>
CommandArgument
='<%# DataBinder.Eval(Container.DataItem,
"OrderID")+","+ DataBinder.Eval(Container.DataItem,
"OrderID")%>' CommandName="Add" >
七、Frameset引起的内部第三方站点cookie丢失的发现解决过程
<html
xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>NUS Business School Global
Alumni Network</title>
<meta
http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
</head>
<frameset rows="0,*"
frameborder="NO" border="0" framespacing="0">
<frame name="emptyFrame" scrolling="NO"
noresize="0" src="empty.htm" marginwidth="0"
marginheight="0" bordercolor="0" >
<frame name="mainFrame" src="http://126.com"
marginwidth="0" marginheight="0"
bordercolor="0">
</frameset>
<body bgcolor="#FFFFFF" text="#000000">
<noframes></noframes>
</body>
</html>
FF登陆正常,IE里登录不正常,因为COOKIE丢失
可以在page里加response.AddHeader("P3P","CP=
文件下载,指定默认名
Response.AddHeader("content-type","application/x-msdownload");
Response.AddHeader("Content-Disposition","attachment;filename=要下载的文件名.rar");
刷新页面
Response.AddHeader “REFRESH”, ”60;URL=newpath/newpage.asp”
这等同于客户机端元素:
页面转向
Response.Status = “302 Object Moved”
Response.Addheader “Location”, “newpath/newpage.asp”
这等同于使用Response.Redirect方法:
Response.Redirect “newpath/newpage.asp”
强制浏览器显示一个用户名/口令对话框
Response.Status= “401 Unauthorized”
Response.Addheader “WWW-Authenticate”, “BASIC”
强制浏览器显示一个用户名/口令对话框,然后使用BASIC验证把它们发送回服务器。
如何让网页不缓冲
Response.Expires = 0
Response.ExpiresAbsolute = Now() - 1
Response.Addheader "pragma","no-cache"
Response.Addheader "cache-control","private"
Response.CacheControl = "no-cache
解决ASP.NET AJAX在frame及iframe中跨域访问的问题
1、为ScriptManager添加脚本引用,不从ScriptResource.axd中加载MicrosoftAjax.js脚本,而是直接加载
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
<Scripts>
<asp:ScriptReference Name="MicrosoftAjax.js" ScriptMode="auto" Path="~/ScriptLibrary/System.Web.Extensions/1.0.61025.0/MicrosoftAjax.js" />
</Scripts>
</asp:ScriptManager>
2、修改MicrosoftAjax.debug.js
删除
switch(Sys.Browser.agent) {
case Sys.Browser.InternetExplorer:与
case Sys.Browser.Safari:
之间的脚本,替换为如下脚本:
Sys.UI.DomElement.getLocation = function(element) {
if (element.self || element.nodeType === 9) return new Sys.UI.Point(0,0);
var clientRect = element.getBoundingClientRect();
if (!clientRect) {
return new Sys.UI.Point(0,0);
}
var ownerDocument = element.document.documentElement;
var offsetX = clientRect.left - 2 + ownerDocument.scrollLeft,
offsetY = clientRect.top - 2 + ownerDocument.scrollTop;
try {
var f = element.ownerDocument.parentWindow.frameElement || null;
if (f) {
var offset = 2 - (f.frameBorder || 1) * 2;
offsetX += offset;
offsetY += offset;
}
}
catch(ex) {
}
return new Sys.UI.Point(offsetX, offsetY);
}
break;