你或许还未听说过的一些ASP.NET 2.0要诀

来源:互联网 发布:哈尔滨编程培训学校 编辑:程序博客网 时间:2024/05/02 00:10
在开发Web应用程序方面,Asp.net是一个令人敬畏的框架。如果你使用过一段时间,那么这就不是什么秘密了。它提供了一些十分强大的新特征,而你只需要些少量的代码就能实现。我曾经列出一个清单,上面是一些你可以只用少量或不用任何c#/VB.net代码就能实现的非常简单(甚至很酷)的功能。如果你有其他建议,可以添加评论,如果你的建议是一件能够容易应用的任务,我将进一步更新我的清单。

1、当页面PostBacks的时候,保持滚动条的位置。
在ASP.NET 1.1中,当进行postback 操作的时候,如果想保持滚动条的位置,那真是一件痛苦的事情,特别是当页面上有一个grid(表格?)而你想编辑某一具体行的时候。页面将会重新加载,滚动条位于页面顶端,而不是你期望的位置,这样你就不得不下拉滚动条。在ASP.net2.0中,你可以简单地在Page directive这里加上MaintainScrollPostionOnPostBack 属性(来实现同样的功能)。
<%@ Page Language="C#" MaintainScrollPositionOnPostback="true" AutoEventWireup="true" CodeFile="" Inherits="" %> 

2、当页面加载的时候,控件获得默认焦点。
这是另一件很简单的事情,而不用通过写javascrip脚本。如果你的页面上只有一个(或者两个)文本输入框,用户为什么非要点击文本框之后才能开始输入呢?光标难道就不能自动位于文本框,用户可以马上输入?使用HtmlForm控件的DefaultFocus 属性,你就可以很容易地做到。
<form id="frm" DefaultFocus="txtUserName" runat="server">
  

</form> 
 
3、当用户按下Enter键的时候,设置默认触发按钮。
在ASP.NET 1.1中,这又是一件十分痛苦的事情。当用户按下Enter键的时候,你需要写一些javascript代码,来保证页面上适当的按钮触发一个服务器端“Click”事件。幸运的是,每当用户按下Enter键的时候,你现在可以使用HtmlForm的DefaultButton 属性来设置点击哪一个按钮。还有一种情况,每当user(指光标是否更合适?)进入页面上不同面板触发不同的按钮,(这个情况下),就可以设置Panel控件的DefaultButton 属性。
<form id="frm" DefaultButton="btnSubmit" runat="server">
  

</form> 

4、容易地定位nested controls(嵌套控件?排列整齐的控件?表达不出来...呵呵~)。
在一个页面的控件层次中查找某些控件,确实是一件很头痛的事。但是如果你知道控件是如何嵌套(nest)的,你可以使用不怎么常用的快捷方式"$"来查找控件,而不用写递归代码。If you're looking for a great way to recursively find a control (in cases where you don't know the exact control nesting) check out my good buddy Michael Palermo's blog entry.(这一句是广告,不翻了~)。以下代码展示了如何使用DefaultFocus 属性来给嵌套在FormView控件里面的文本框设置焦点。注意,用“$”来划定嵌套方式(nesting):
<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()方法,也有一点小技巧。想了解更多细节,稍后请访问 I blogged about this 。这里有一个例子:
TextBox tb = this.FindControl("form1$formVw$txtName") as TextBox;
if (tb != null)
{
    
//Access TextBox control


5、Strongly-typed access to cross-page postback controls强类型方式访问跨页面PostBack控件。
这一条比其他任何一点都更加involved(“包含”?不像,应该是“不常用”的意思吧),但是十分有用。一个页面提交信息到另一个页面,在这里ASP.NET 2.0介绍了跨页面提交的概念。按钮提交数据到一个页面,把按钮的PostBackUrl属性设置为目标页面的名字,就是通过这种方式(实现跨页面提交)。
一般情况下,可以通过PreviousPage.FindControl("ControlID")方式来访问提交的数据。然而,这需要看情况(requires a cast),如果你需要访问先前页面中的属性(经常需要这么做)。如果在发起回传操作的页面后台代码中增加一个公有属性,那么你可以通过在本次回传的目标页中增加PreviousPageType directive,以强类型的方式来访问这些公有属性。如果你还没有尝试过,这听起来或许有点混淆,所以允许我多解释一些。

假如有一个页面叫做Default.aspx,同时向外提供一个公有属性,来返回页面中定义的TextBox的值。数据所要提交到的页面(姑且叫做SearchResult.aspx吧)就能够以强类型的方式访问到这些属性,只需要在SearchResult.aspx页面顶端增加PreviousPageType directive:

<%@ PreviousPageType VirtualPath="Default.aspx" %> 

通过添加这个directive,SearchResult.aspx中的代码就可以以强类型的方式访问Default.aspx中定义的TextBox。在以下的示例中,假设Default.aspx中定义的属性名是SearchTextBox.

TextBox tb = PreviousPage.SearchTextBox; 

很明显,这行代码只有在上一页(Previous Page)是Default.aspx的情况下才能正常运行。同时PreviousPageType 也有一个TypeName属性,根据这个属性,你可以定义一个基类型,这样你可以让一个或者多个页面获取这个基类型的值来支持多页面。你可以从这里了解更多关于PreviousPageType。
(这段代码不好翻译,免于出错,仅给出部分意思,望达人补充,原文如下:This code obviously only works if the previous page is Default.aspx.  PreviousPageType also has a TypeName property as well where you could define a base type that one or more pages derive from to make this technique work with multiple pages.  You can learn more about PreviousPageType here.)

6、强类型方式访问MasterPages控件。
PreviousPageType directive 不是唯一一种提供强类型访问控件的方式。如果想通过强类型的方式访问定义在MasterPages中的控件,你可以在要显示的页面中增加MasterType directive(记住,MasterType directive和PreviousPageType directive一样,也可以定义一个类型名)

<%@ MasterType VirtualPath="MasterPage.master" %> 

这样,你就能在content page中按以下代码方式访问目标master page中的属性:

this.Master.HeaderText = "Label updated using MasterType directive with VirtualPath attribute."

你也可以找到一些关于使用master page的技巧,包括在我先前的一篇blog中所提到的“共享master page访问IIS虚拟目录”等。

7、验证组 Validation groups
你有这样一个页面,包含几个控件和几个按钮。当点击其中一个按钮的时候,你希望evaluate指定的按钮(evaluate原意:评估,得到……的值;这里的意思:得到按钮的值),而不是页面中所有的按钮。在ASP.NET 1.1 中,如果不去resorting to some hack code(怎么译?)的话,就很难处理这样的问题。ASP.NET 2.0给所有的验证控件和按钮(Button,LinkButton)增加了一个ValidationGroup属性,可以很容易地解决问题。如果在页面顶端有一个TextBox和一个Button控件,紧挨着TextBox是一个RequiredFieldValidator控件,把button和RequiredFieldValidator控件上的ValidationGroup属性值设置为相同的值,当点击按钮的时候,你就能fire(“激活”?不解~)一个验证。当点击按钮的时候,任何定义在ValidationGroup之外的验证都被忽略了。这里有一个示例:

<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> 

8、编码的时候查找控件或者变量的名字。
这个技巧和Asp.net没有直接关系,与VS.net反而更有关系。对你们这些只记住了控件或变量名的前几个字母而没有记住全名的人来说,这个技巧确实十分有用。这让我又有机会去提起来自microsoft下载到的两个伟大的下载。第一,在输入控件名的前几个字母的时候,按下CTRL+SPACEBAR,VS.net将会跳出一个匹配项的简短列表。的确,这将更加容易地找到控件或者变量的名字。(译者注:怎么没有第二了?)对于感兴趣的朋友,微软提供整套完整的VS.net快捷键下载:c# Version here和VB.NET Version here 

补充一点:

 1. ~ 的用法

  一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不同层次的两个目录的aspx文件分别引用时,问题就会出现了。

  ~/image/about.bmp 是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览它。

  2. 在刷新和提交页面后,保存你的页面滚动条的位置

  经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370个控件又需要他选择一下?

  用下面的方法可以很快地确定和记住你提交前的位置。

  网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,不过他使用了Web Behavior这意味着你需要使用一个.htc文件

Private Sub RetainScrollPosition()

Dim saveScrollPosition As New StringBuilder
Dim setScrollPosition As New StringBuilder

RegisterHiddenField("__SCROLLPOS", "0")
saveScrollPosition.Append("<script language='javascript'>")
saveScrollPosition.Append("function saveScrollPosition() {")
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = thebody.scrollTop;")
saveScrollPosition.Append("}")
saveScrollPosition.Append("thebody.onscroll=saveScrollPosition;")
saveScrollPosition.Append("</script>")

RegisterStartupScript("saveScroll", saveScrollPosition.ToString())

If (Page.IsPostBack = True) Then

setScrollPosition.Append("<script language='javascript'>")
setScrollPosition.Append("function setScrollPosition() {")
setScrollPosition.Append(" thebody.scrollTop = " & Request("__SCROLLPOS") & ";")
setScrollPosition.Append("}")
setScrollPosition.Append("thebody.onload=setScrollPosition;")
setScrollPosition.Append("</script>")
RegisterStartupScript("setScroll", setScrollPosition.ToString())

End If

End Sub

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
RetainScrollPosition()
End Sub

  3. DataList使用不同风格的模板

  这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个元素或是加一个促销广告图等等。

Dim theme As String
theme = DropDownList1.SelectedValue

DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
DataList1.DataSource = DS
DataList1.DataBind()


  4. 设置服务器端控件的焦点

Private Sub SetFocus(ByVal controlToFocus As Control)
Dim scriptFunction As New StringBuilder
Dim scriptClientId As String

scriptClientId = controlToFocus.ClientID
scriptFunction.Append("<script language='javascript'>")
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
scriptFunction.Append("</script>")
RegisterStartupScript("focus", scriptFunction.ToString())
End Sub

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If (Page.IsPostBack = False) Then
SetFocus(TextBox1)
End If
End Sub


  5. 滚动DataGrid

  这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控件放在一个DIV中将overflow属性设置成auto

<div style=“height:400px;width:200px;overflow:auto”>
<asp:datagrid id=“MyGrid” runat=“server”/>
</div>

  6. 动态创建控件

  利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。

Sub Page_Load()
Dim i as Integer
For i=0 to 4
Dim myUserControl as Control
myUserControl = Page.LoadControl(“foo.ascx”)
PlaceHolder1.Controls.Add(myUserControl)
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
Next i
End Sub


  7. 客户端代码的使用

  1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性

asp:ImageButton id=“foo”
ImageUrl=“start.jpg”
onMouseOver=“rollover(this);”
onMouseOut=“rollout(this)”
rolloversrc=“myrollover.jpg”
rolloutsrc=“myrollout.jpg”
runat=“server”/>

<input type=Button onClick=“return clientHandler()”
onServerClick=“Button1_Click” … />


  2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所有的客户端控件。

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles MyBase.Load
 RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
End Sub


  3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术

  以上文章介绍了一些ASP.NET中常用而且比较实用的技巧,希望能对大家的实际开发有所裨益! 

原创粉丝点击