komatu

       暗  香  堂
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#2.0学习笔记(2)

Posted on 2006-03-30 11:06  暗香堂  阅读(200)  评论(0)    收藏  举报
 

GridView DataGrid 控件的高级功能相似,但基础却不同。GridView 尽可能地保留了 DataGrid 的对象模型,以便轻松地从现有页面进行移植。但是,基于 DataGrid 的代码与新的基于 GridView 的代码不可能 100% 兼容。

DataGrid GridView 控件的另一个主要差异在于自适应用户界面。与 1.x 版本的 DataGrid 不同的是,GridView 也能在移动设备上显示。换句话说,您能够使用相同的用于桌面页面的网格控件在移动设备上生成报告。2.0 版本的 DataGrid 也能自适应地显示,但是它的 UI 功能没有 GridView 丰富。

13ASP.NET 类关系图

14FormView DetailsView 有两方面的功能差异。首先,FormView 控件具有 ItemTemplateEditItemTemplate InsertItemTemplate 属性,而 DetailsView 一个也没有。其次,FormView 缺少命令行将可用功能进行分组的工具栏。与 GridView DetailsView 控件不同的是,FormView 没有其自己默认的显示布局。同时,它的图形化布局完全是通过模板自定义的。

15.对于<sessionState cookieless="true" />的站点,会话 ID 直接显示在地址栏中!请尝试下列操作:

1. 连接到使用无 Cookie 会话的 Web 站点(例如,MapPoint)并获得一个映射。此时,该地址存储在会话状态中。 

2.抓取 URL(直至页名称)。不要包括查询字符串,但请确保该 URL 包括会话 ID 

3.将该 URL 保存到文件中,并将该文件复制/发送到另一台计算机。 

4.在第二台计算机上打开该文件,并将该 URL 粘贴到新浏览器实例中。 

5.只要会话超时仍然有效,就会显示同一个映射。

通过无 Cookie 会话,可以比以往任何时候都更加容易地窃取会话 ID。具有一定危险(会话劫持!)

使用无 Cookie 会话还会引起与链接有关的问题。例如,您不能在 ASP.NET 页中具有绝对的、完全限定的链接。如果您这样做,那么源自该超链接的每个请求都将被视为新会话的一部分。无 Cookie 会话要求您总是使用相对 URL,就像在 ASP.NET 回发中一样。仅当您可以将会话 ID 嵌入到 URL 中时,您才可以使用完全限定的 URL。但是,既然会话 ID 是在运行时生成的,那么您如何才能做到这一点呢?

下面的代码中断了该会话:

<a runat="server" href="/test/page.aspx">Click</a>

要使用绝对 URL,可以借助于一个小技巧,即使用 HttpResponse 类上的 ApplyAppPathModifier 方法:

<a runat="server" href=<% =Response.ApplyAppPathModifier("/test/page.aspx")%> >Click</a>

ApplyAppPathModifier方法采用一个表示URL的字符串作为参数,并且返回一个嵌入了会话信息的绝对 URL。例如,当您需要从 HTTP 页重定向到 HTTPS 页时,该技巧尤其有用。最后,请特别注意,每当您在同一个浏览器内部键入指向某个站点的路径时,您都将丢失无 Cookie 会话的状态。还要请您注意的是,对于移动应用程序,如果设备无法处理专门格式化的 URL,则无 Cookie 会话可能会出现问题。

16IDataRecord。这是所有 DataReader 实现的接口。使用 IDataRecord 使我们的映射过程独立于供应商。

17.应当注意 ASP.NET 公开了一个鲜为人知的类,可用于编码和哈希任何序列化的对象.该类为 LosFormatterViewState 实现用于创建回程到客户端的编码文本正是同一个类。

private string EncodeText(string text) {
 StringWriter writer = new StringWriter();
 LosFormatter formatter = new LosFormatter();
 formatter.Serialize(writer, text);
 return writer.ToString();
}

18ASP.Net生命周期添加动态控件的正常时间是在初始化阶段,因为它发生在加载视图状态阶段和加载回发数据阶段之前。而,在初始化阶段,视图状态和回发数据都还没还原,因此不建议访问或设置可能存储在视图状态或被回发值修改的控件属性(不管是动态还是静态控件),因为这些值将被生命周期后续阶段的视图状态和回发值所覆盖。当处理动态控件时我使用了以下模式:

在初始化阶段,我向控件层次结构添加动态控件并设置 ID 属性

在加载阶段,我在 If Not Page.IsPostback 条件语句中为动态控件赋予任何需要的初始值

 

192005CS代码修改后不需要编译即可做改动??

20.泛型类型的声明允许任意数目的类型参数。上面的Stack<T>例子只有一个类型参数,但一个泛型的Dictionary类可能有两个类型参数,一个是键的类型另一个是值的类型:

public class Dictionary<K,V>

{

public void Add(K key, V value) {...}

public V this[K key] {...}

}

使用Dictionary<K,V>时,需要提供两个类型参数:

Dictionary<string,Customer> dict = new Dictionary<string,Customer>();

dict.Add("Peter", new Customer());

Customer c = dict["Peter"];

 

Add方法中可能需要调用特定类型的方法可以采用约束来实现:

对于给定的类型参数,可以指定任意数目的接口作为约束,但只能指定一个类(作为约束)。每一个被约束的类型参数都有一个独立的where子句。在下面的例子中,类型参数K有两个接口约束,而类型参数E有一个类约束和一个构造器约束:

public class EntityTable<K,E>

where K: IComparable<K>, IPersistable

where E: Entity, new()

{

public void Add(K key, E entity)

{

...

if (key.CompareTo(x) < 0) {...}

...

}

}

上面例子中的构造器约束,new(),保证了作为的E类型变量的类型具有一个公共、无参的构造器,并允许泛型类使用new E()来建立该类型的一个实例。

 

这种方案提供了更强大的编译期间类型。泛型类的思想用在泛型方法上也是一样的。

21.得到一个可枚举类型:采用<T>实现IEnumerato接口

22.不完全类型允许类、结构和接口被分成多个小块儿并存贮在不同的源文件中使其容易开发和维护。另外,不完全类型可以分离机器产生的代码和用户书写的部分,这使得用工具来加强产生的代码变得容易。定义时用partial标记。理解:不完全泛型可枚举类型的类。不完全类型的典型应用是在code-beside上。

22C#语言核心,近年来动作很大,继2.0加入泛型、匿名方法、迭代器、不完整类型、Nullable类型

23.匿名方法的一般运用:

void Page_Load (object sender, System.EventArgs e)

{

   EventHandler handler = delegate(object dlgSender, EventArgs dlgE)

   {

      Label1.Text = "Yeah, you clicked the button!";

   };

   this.Button1.Click += handler;

   this.Button2.Click += handler;

}