代码改变世界

当页面PostBacks的时候,保持滚动条的位置

2012-02-12 23:21  火-麒-麟  阅读(317)  评论(0编辑  收藏  举报

1、当页面PostBacks的时候,保持滚动条的位置。
在ASP.NET 1.1中,当进行postback 操作的时候,如果想保持滚动条的位置,那真是一件痛苦的事情,特别是当页面上有一个grid(表格?)而你想编辑某一具体行的时候。页面将会重新加载,滚 动条位于页面顶端,而不是你期望的位置,这样你就不得不下拉滚动条。在ASP.net2.0中,你可以简单地在Page directive这里加上MaintainScrollPostionOnPostBack 属性(来实现同样的功能)。
<%@ Page Language="C#" MaintainScrollPositi 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)的,你可以使用不怎么常用的快捷方式"$"来查找控 件,而不用写递归代码。以下代码展示了如何使用DefaultFocus 属性来给嵌套在FormView控件里面的文本框设置焦点。注意,用“$”来划定嵌套方式(nesting):
<form id="form1" runat="server" DefaultFocus="formVw$txtName">
    <div>
        <asp:FormView ID="formVw" runat="server">
            <ItemTemplate>
                Name:
                <aspextBox 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、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属性,根据这个属性,你可以定义一个基类型,这样你可以让一个或者多个页面获取这个基类型的值来支持多页面。
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.";
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: <aspextBox ID="txtSearch" runat="server" />

    <asp:RequiredFieldValidator ID="valSearch" runat="Server"
      C Validati />

    <asp:Button ID="btnSearch" runat="server" Text="Search"
      Validati />
    .
    Other controls with validators and buttons defined here
</form>

8、编码的时候查找控件或者变量的名字。
这 个技巧和Asp.net没有直接关系,与VS.net反而更有关系。对你们这些只记住了控件或变量名的前几个字母而没有记住全名的人来说,这个技巧确实十 分有用。这让我又有机会去提起来自microsoft下载到的两个伟大的下载。第一,在输入控件名的前几个字母的时候,按下 CTRL+SPACEBAR,VS.net将会跳出一个匹配项的简短列表。的确,这将更加容易地找到控件或者变量的名字。