icql

clr-托管模块

类型

类型成员

泛型

}


## 接口和委托
* 1.接口(CLR不支持多继承,接口则是“缩水版多继承”)
    * 基本特性:
        * 接口只是定义了方法,不提供具体实现,而继承接口的类必须显示的实现方法,相当于
            * 接口 = 做什么,但不指定你怎么做,属于高级领导,光说话不干事
            * 类实现 = 完成接口规定的任务,属于具体办事的,但必须完成领导安排的
        * 接口不能实例化,是一种特殊的引用类型
        * 值类型可以实现接口,但必须进行装箱
        * 凡是使用【基类型实例】的地方,都能使用【派生类型实例】
        * 凡是使用【具名接口类型】的地方,都能使用【实现接口的一个类型实例】
        ```csharp
        Animal a = new Dog();
        IList<string> = new List<string>();
        ```
    * 定义和实现接口(约定接口名以I开头)
    ``` csharp
    public interface IAnimal /*接口类型的修饰符只能是public,可以省略*/
    {
        /*接口成员只可以有 方法(包括一般方法和属性),事件;
        接口成员访问修饰符必须是public(可以省略),不可以有修饰符static,继承修饰符(abstract,virtual和override);
        接口成员不能有具体实现,只能定义;
        */
        void Do(string dosomething);
    }
    class Dog : IAnimal
    {
        /*类型实现的接口成员必须是显示的标记为public;
        若不显示的标记 virtual,编译器会将其标记为virtual 和 sealed不让派生类继承和重写此成员;
        若显示的标记 virtual,编译器只会将其标记为virtual,允许派生类重写
        */
        public void Do(string dosomething);
    }
    ```
    * 泛型接口
        * 类型安全,相对于非泛型接口的Object参数
        * 处理值类型装箱次数会变少
        * 类可以实现一个泛型接口若干次,例如同时实现:IList<string>,IList<int>
    * 实现多个具有相同方法名和签名的接口:须在实现的类中显示的实现出来,如 void IList.Dosomething(){}
    * 显示实现接口的利弊(EIMI)详见13.9,13.10
    * 设计:基类还是接口
        * IS-A关系:属于,应该用基类
        * CAN-DO关系:能做某事,应该用接口
* 2.委托(.NET Framework通过委托来提供回调函数机制,委托确保类型安全)
    * 入门参考(http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx)
    * 简单示例
    ```csharp
    /*委托类型相当于是定义一个代表(一组参数和返回值相同的方法)类型,可作为参数传递给任何一个方法,委托类型代表的是具有规定参数和返回值的方法;注:方法签名由方法名称和一个参数列表(方法的参数顺序和类型)组成*/
    using System;
    using System.Collections.Generic;
    using System.Text;
    namespace Delegate {
        /*定义委托,它定义了可以代表的方法的类型(参数和返回值),dlegate相当于class,GreetingDelegate是一个委托类型*/
        public delegate void GreetingDelegate(string name);
        class Program {
            private static void EnglishGreeting(string name) {
                Console.WriteLine("Morning, " + name);
            }
            private static void ChineseGreeting(string name) {
                Console.WriteLine("早上好, " + name);
            }
            /*注意此方法,它接受一个GreetingDelegate委托类型的方法作为参数*/
            private static void GreetPeople(string name, GreetingDelegate MakeGreeting) {
                MakeGreeting(name);
            }
            static void Main(string[] args) {
                /*调用以委托类型作为参数的方法,传递的实参可以是满足委托类型的任何方法(即参数和返回值相同)*/
                GreetPeople("Jimmy Zhang", EnglishGreeting);
                GreetPeople("张子阳", ChineseGreeting);
                Console.ReadKey();
            }
        }
    }
    输出如下:
    Morning, Jimmy Zhang
    早上好, 张子阳
    ```
    * 委托优势:委托是一种类型,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性
    * 委托类型可以实例化后,绑定若干具有相同返回值和参数的方法,相当于这些方法的指针
    ```csharp
    /*声明委托,分别赋值*/
    GreetingDelegate delegate1, delegate2;
    delegate1 = EnglishGreeting;
    delegate2 = ChineseGreeting;
    GreetPeople("Jimmy Zhang", delegate1);
    GreetPeople("张子阳", delegate2);
    /*声明委托,一个委托实例可以绑定多个方法,有顺序*/
    GreetingDelegate delegate1;
    delegate1 = EnglishGreeting; /*先给委托类型的变量赋值*/
    delegate1 += ChineseGreeting; /*给此委托变量再绑定一个方法*/
    GreetPeople("Jimmy Zhang", delegate1); 
    delegate1 = EnglishGreeting; /*先给委托类型的变量赋值*/
    delegate1 += ChineseGreeting; /*给此委托变量再绑定一个方法*/
    delegate1 ("Jimmy Zhang");/*将先后调用 EnglishGreeting 与 ChineseGreeting 方法*/
    ```
    * 委托类型实例化后既可以绑定方法也可以取消绑定 delegate1 -= EnglishGreeting;
    * 事件:Event,定义委托类型实例化后的变量,是类型成员
        * 一般使用事件方法:
            * 在类的内部:给事件注册方法可以用"="和"+=",注销方法用"-="
            * 在类的外部:给事件注册方法只能用"+=",注销方法用"-="
            * 触发事件:事件名(传入实参);
            * 示例:
            ```csharp
            MakeGreet += Do;/*给事件注册方法:Do是方法名*/ 
            MakeGreet("123");/*触发事件,会调用执行所有注册在此事件上的方法*/
            ```
        * C#使用事件标准:
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Mail
{
    /*需要 传递附加信息 给 已注册事件的方法 时,建立新类(继承自EventArgs)容纳信息;
    若不需要传递附加信息,则可以直接使用 EventArgs.Empty
    */
    class NewMailEventArgs : EventArgs
    {
        private readonly string m_from, m_to, m_subject;
        public string From { get { return m_from; } }
        public string To { get { return m_to; } }
        public string Subject { get { return m_subject; } }

        public NewMailEventArgs(string from, string to, string subject) 
        {
            m_from = from;
            m_to = to;
            m_subject = subject;
        }

    }
    class MailManager
    {
        /*
            泛型委托EventHandler<T>,定义如下:
            public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
            所以方法原型必须符合 返回值void,参数为object sender和TEventArgs e,即满足:
            void MethodName(object sender, TEventArgs e){};
        */
        /*定义事件成员*/
        public event EventHandler<NewMailEventArgs> NewMail;
        /*定义引发事件方法*/
        protected virtual void OnNewMail(NewMailEventArgs e) 
        {
            /*出于委托线程安全,不直接使用事件NewMail
            EventHandler<NewMailEventArgs> temp = Volatile.Read(ref NewMail);
            if (temp != null)
                temp(this, e);*/
            e.Raise<NewMailEventArgs>(this, ref NewMail);
        }
        /*定义方法将输入转化为期望事件*/
        public void SimulateNewMail(String from,string to,string subject)
        {
            NewMailEventArgs e = new NewMailEventArgs(from,to,subject );
            OnNewMail(e);
        }

    }

    /*扩展委托线程安全*/
    public static class EventArgExtensions
    {
        public static void Raise<TEventArgs>(this TEventArgs e, Object sender, ref EventHandler<TEventArgs> eventDelegate) 
        {
            /*出于委托线程安全,不直接使用事件NewMail*/
            EventHandler<TEventArgs> temp = Volatile.Read(ref eventDelegate);
            if (temp != null)
                temp(sender, e);
        }
    }
    /*给事件注册方法*/
    class Fax
    {
        public Fax(MailManager mm)
        {
            mm.NewMail += FaxMsg;
        }
        private void FaxMsg(object sender, NewMailEventArgs e)
        {
            Console.WriteLine("Faxing mail message:");
            Console.WriteLine("From={0},To={1},Subject={2}", e.From, e.To, e.Subject);
        }
        public void Unregister(MailManager mm)
        {
            mm.NewMail -= FaxMsg;
        }
    }
    /*触发事件*/
    class Program
    {
        static  void Subject(object sender,NewMailEventArgs e)
        {
            Console.WriteLine(sender);
            Console.WriteLine(e.From +"\n"+e.To +"\n"+e.Subject);
        }
        static void Main(string[] args)
        {
            MailManager manager = new MailManager();
            manager.NewMail += Subject;
            Fax s = new Fax(manager );
            s.Unregister(manager);
            manager.SimulateNewMail("icql@qq.com","37612949@qq.com","test");
            Console.ReadKey();
        }
    }
}

字符和字符串

枚举类型和数组

定制特性和可空值类型

异常

clr编译执行源代码过程

内存管理和垃圾回收

appdomain-反射-序列化

线程基础

流,编码,xml,序列化和反序列化

ado.net

* 1.ADO.NET组成
    * 数据提供程序(常用类)
        * Connection, 用来 连接 数据库
        * Command, 用来执行 SQL语句
        * DataReader, 只读、只进的结果集,一条一条读取数据(StreamReader、XmlReader类库中这些Reader的使用方式差不多)
        * DataAdapter, 一个封装了上面3个对象的对象
    * 执行方法
        [ExecuteNonQuery、ExecuteScalar和ExecuteReader(Reader的特性)](http://blog.csdn.net/gengyudan/article/details/11890319)
    * 数据集(DataSet),临时数据库,断开式数据操作

* 2.原始操作数据库过程:
    string conStr = "Data Source=A6924;Initial Catalog=TEST;User Id=sa;Password=006924";/*创建连接字符串*/
    using (SqlConnection con = new SqlConnection(conStr))/*创建连接对象*/
    {
        string sql = "";/*sql语句*/
        using (SqlCommand cmd = new SqlCommand(sql, con))/*创建Command对象*/
        {
            con.Open();/*打开数据库*/
            /*不返回数据*/
            cmd.ExecuteNoQuery();
            /*返回单个数据*/
            string result=cmd.ExecuteScalar();
            /*返回多行多列*/
            using (SqlDataReader reader = cmd.ExecuteReader())/*创建reader对象,执行操作*/
            {
                if (reader.HasRows)/*判断是否查询到数据*/
                {
                    while (reader.Read())
                    {
                    string parm = reader.GetString(0);
                    ...
                    }
                }
            }
        }
    }

* 3.参数化sql语句
    * T-SQL语句中,参数用 @参数名 代替
        select count(1) from 表名 where loginId=@loginId and loginPwd=@loginPwd
    * 给参数赋值(2种)
    /*推荐使用*/
    SqlParameter paramLoginId = new SqlParameter("@loginId",SqlDbType.Varchar,50){Value=}
    SqlParameter[] pms=new SqlParameter[]
    {
        new SqlParameter("@loginId",SqlDbType.Varchar,50){Value=},
        new SqlParameter("@loginPwd",SqlDbType.Varchar,50){Value=}
    }
    cmd.Parameters.Add(paramLoginId);
    cmd.Parameters.AddRange(pms);
    /*直接使用*/
    cmd.Parameters.AddWithValue("@loginId",值)

** 4.连接池

* 5.向数据库中插入null值:不能直接使用 C# 中的 null,必须使用 DBNull.Value

* 6.DataAdapter:DataAdapter是一个封装了3个(Connection,Command,DataReader)的对象,使用时只需2个参数(sql语句,连接字符串conStr)
    string conStr = "Data Source=A6924;Initial Catalog=TEST;User Id=sa;Password=006924";
    string sql = "select * from NE_CARD_FULLCARDINFO";
    DataTable dt = new DataTable();
    using (SqlDataAdapter adapter = new SqlDataAdapter(sql,conStr)) 
    {
        adapter.Fill(dt);
    }
    this.dataGridView1.DataSource = dt;

* 7.DataSet和DataTable
    * DataSet:临时数据库,存储在内存的数据库
    * DataTable:DataSet中表

* 8.封装sqlHelper
    * 1.完整封装SqlHelper
    [SqlHelper.cs](https://github.com/chenqinglin93/File-backup/blob/master/App_Code/SqlHelper.cs)
    [OracleHelper](https://github.com/chenqinglin93/File-backup/blob/master/App_Code/OracleHelper.cs)

    * 2.简单封装SqlHelper
    添加引用System.Configuration
    using System.Data.SqlClient;
    using System.Configuration;


    public static class SqlHelper
    {
    /*定义连接字符串,
    readonly修饰的变量,只能在初始化时赋值,以及在构造函数装赋值,其他地方只读,
    增加配置文件
    <connectionStrings>
        <add name="NewEnergyConnectionString" connectionString="Data Source=A6924;Initial Catalog=TEST;User Id=sa;Password=006924" providerName="System.Data.OracleClient"/>
    </connectionStrings>
    */
    private static readonly string conStr = ConfigurationManager.ConnectionStrings["NewEnergyConnectionString"].ConnectionString;
    /*1.执行增(insert)(delete)(update)*/
    /*private static int ExecuteNonQuery(string sql,dynamic param = null)*/
    public static int ExecuteNonQuery(string sql, params SqlParameter[] pms)
    {
        using (SqlConnection con = new SqlConnection(conStr))
        {
            using (SqlCommand cmd = new SqlCommand(sql, con))
            {
                if (pms != null)
                {
                    cmd.Parameters.AddRange(pms);
                }
                con.Open();
                return cmd.ExecuteNonQuery();
            }
        }
    }
    /*2.执行查询,返回单个值*/
    public static object ExecuteScalar(string sql, params SqlParameter[] pms)
    {
        using (SqlConnection con = new SqlConnection(conStr))
        {
            using (SqlCommand cmd = new SqlCommand(sql, con))
            {
                if (pms != null)
                {
                    cmd.Parameters.AddRange(pms);
                }
                con.Open();
                return cmd.ExecuteScalar();
            }
        }
    }
    /*3.执行查询,返回多行多列*/
    public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] pms)
    {
        SqlConnection con = new SqlConnection(conStr);
        using (SqlCommand cmd = new SqlCommand(sql, con))
        {
            if (pms != null)
            {
                cmd.Parameters.AddRange(pms);
            }
            try
            {
                con.Open();
                /*System.Data.CommandBehavior.CloseConnection这个枚举参数表示将来使用完SqlDataReader后,在关闭reader的同时,SqlDataReader内部关联的Connection对象也关闭掉*/
                return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
            }
            catch
            {
                con.Close();
                con.Dispose();
                throw;
            }
        }
    }
    /*4.执行查询,返回DataTable*/
    public static DataTable ExecuteDataTable(string sql, params SqlParameter[] pms)
    {
        DataTable dt = new DataTable();
        using (SqlDataAdapter adapter = new SqlDataAdapter(sql, conStr))
        {
            if (pms != null)
            {
                adapter.SelectCommand.Parameters.AddRange(pms);
            }
            adapter.Fill(dt);
        }
        return dt;
    }
    }

asp.net-mvc

### Controller控制器

### View视图
* ViewBag、ViewData和ViewDataDictionary
    * ViewDataDictionary是一个特殊的字典类,ViewData是它的实例,ViewBag是ViewData的动态封装器
    * ViewBag.Date等同于ViewData["Date"],两者的重要区别在于ViewBag是动态的,不具有真正的类型,无法做强类型(主要用作智能感应,方便编写页面代码),不能作为参数传递,而ViewData可以
* 强类型视图:控制器方法的返回值直接作为
* Razor使用规范
    * 单行:@C#代码;
    * 多行:@{C#代码}
    * C#代码与html标签混合,须使用@
    * 当Razor和html有二义性时,使用()区分
    * @@转义@
    * html编码:Razor是html自动编码,是指C#字符串里的html代码若要输出html代码,可以使用@Html.Raw(""),即使用一个System.Web.IHtmlString对象实例
    * javascript编码:@Ajax.JavaScriptEncode(ViewBag.Username) 代替 @ViewBag.Username避免js中注入攻击
    * 服务器端注释 @* *@
* 模板布局视图:@RenderBody()——主体部分(引用该布局的视图在此位置),@RenderSection("Footer")节,多个重载,可设置可选节,引用视图中使用 @section Footer{<h1>内容</h1>}
* ViewStart:解决使用普通视图作为布局页引起的冗余问题,默认新建MVC项目会自动生成_ViewStart.cshtml文件,默认指定一个布局。。。详细待后续学习
* 部分视图PartialView
	
### Model模型
* 使用EF框架,代码优先
    * 在Models文件夹下创建有关联的各个实体类
    * 再添加控制器(选择带有EF框架的选项),选择模型,创建数据访问上下文类
    
### HTML辅助方法
### 注解和验证

### controller向view传递数据
* 1. Model
后台Action方法里
return View(object model);
前台使用
@model 类型   必须在第一行声明
@Modle.属性名

* 2. ViewBag
后台Action方法里
ViewBag.xxx="";
前台
@ViewBag.xxx

* 3. ViewData(现在不常用)
后台Action方法里
ViewData["Message"] = "Hello";  
前台
@ViewData["Message"]  

* 4. 参考
http://www.cnblogs.com/zyh-club/p/4941576.html

### view向controller传递数据
(前台传递的数据名称须和后台Action中的参数名称需要保证一致)
* 1.url传参
    * 1.1 MVC路由机制
        * 1.1.1 /控制器名/方法名/参数名=值
        * 1.1.2 /控制器名/方法名/值	(一个参数时默认复制给参数,无需写参数名)

* 2. 表单Form(无返回值)
    * 2.1 View页面的Form形式
        * 2.1.1 传统Form表单
            <form action="@Url.Action("AskForm")" method="post">
                <input type="text" name="input1" value="默认值" />
                <input type="text" name="input2" value="默认值" />
                <input type="submit" value="提交"/>
            </form>
        * 2.1.2 MVC:HtmlHelper方法
            * @Html.BeginForm()
                @using (Html.BeginForm("Apply", "Star", FormMethod.Post, new  {@class="MyForm"}))
                {
                    <input type="text" name="input" value="默认值" />
                    @Html.TextBox("CARNO")
                    <input type="submit" value="提交"/>
                }
            * @Html.BeginRouteForm(),与上面类似
    * 2.2 传递数据类型及实现方法
        * 2.2.1 传递基本数据:前台html表单元素name属性值无规则,后台Action方法参数(name属性值1,...),或者后台Action方法里 string Username = Request["html表单元素name属性值"];
        * 2.2.2 传递model(一个对象):前台html表单元素name属性值对应某类对象的属性
            前台
            @using (Html.BeginForm("Index", "Home", FormMethod.Get))
            {
                <td> @Html.TextBox("No") </td>
                <td> @Html.TextBox("Name") </td>
                <td> @Html.TextBox("Gender") </td>
                <td> @Html.TextBox("Address") </td>
                <td><input type="submit" value="提交" /></td>
            }
            后台
            public class YYM
            {
                public string No { get; set; }
                public string Name { get; set; }
                public string Gender { get; set; }
                public string Address { get; set; }
            }
            public ActionResult Index(YYM ca)
            {
                var d = ca.Name;
                var s = ca.No;
                return View();
            }
        * 2.2.3 传递集合:
            * 传递基本类型集合(数组)
                前台:html表单元素name属性值相同
                后台:public ActionResult Index(List<string> html表单元素name属性值)
            * 传递模型集合(暂时不会)

* 3. AJAX和Jquery(有返回值的,异步,网址不变)
    * 3.1 View页面的AJAX形式
        * 3.1.1 MVC:AjaxHelper方法
            * 需要引入:
                <script src="~/Scripts/jquery-1.8.0.min.js"></script>
                <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
            * @Ajax.BeginForm()
            @using (Ajax.BeginForm("Excute","Home",
                new AjaxOptions
                {
                    OnBegin = "return ValidateLog()提交前验证有返回值的js函数名"
                    UpdateTargetId="成功后更新的html元素ID",
                    OnSuccess = "con,回调js函数名(只写函数名)"
                }))
            {
                @Html.TextBox("name")
                @Html.TextBox("name")
                <input type="submit" value="提交" />
            }
            <script>
                function ValidateLog() {
                    if()*****
                    return false;
                }
                function con(data) {
                    alert(data);
                }
            </script>
            * @Ajax.BeginRouteForm()
            * @Ajax.ActionLink()
        * 3.1.2 js函数提交:
            function()
            {
            绑定要提交的data数据值
            var data= ;
            /*Jquery里AJAX的4种形式:如果提交的数据是js对象,须在data:使用JSON.stringify()将对象转为字符串*/
            $.ajax({
                type: "post",
                contentType: 'application/json;charset=utf-8',
                url: '/Resources/GetList.ashx',
                data: 提交的数据,
                success: function (data) {}
            });
            $.get("url",{提交的数据},function(data){});
            $.post("url",{提交的数据},function(data){});
            $.getJSON("url",{提交的数据},function(data){}); 
            }
    * 3.2 传递数据类型及实现方法
        /*传递基本数据类型*/
        前台js:
        var obj = {
                    parm1: 100,
                    parm2: "我是string",
                    parm3: true,
                    parm4: 1.23,
                    parm5: 9.999999
                };
        后台Action方法参数(parm1,parm2...)
        /*传递model(一个对象):数据对象obj的属性名对应某类对象的属性*/
        前台js:
        var obj = {
                    UserName: '张三',
                    UserPassWord: '不告诉你',
                    UserSex: '男',
                    UserPhone: '138888888888'
                };
        后台Action方法参数(UserInfo ca)
        /*传递多个不同对象*/
        前台js:
        var userinfoObj = {
                    UserName: '张三',
                    UserPassWord: '不告诉你',
                    UserSex: '男',
                    UserPhone: '138888888888'
                };
        var addressObj = {
            Country: '中国',
            Province: '江西',
            City: '南昌',
            Street: '红谷滩新区XX路XX号'
        };
        Ajax函数里data参数:
            data: JSON.stringify({
                userinfo: userinfoObj,
                address: addressObj
            }),
        后台Action方法参数(UserInfo userinfo, Address address)
        /*传递对象集合*/
        var model = [];  
        $.each($("table tr"), function (i, item) {  
            var RTONumber = $(item).find("[name=rtoNumber]").val();  
            var Approver = $(item).find("[name=approver]").val();  
            var Modifier = $(item).find("[name=modifier]").val();  
            var Comment = $(item).find("[name=comment]").val();  
            model.push({ rtoNumber: RTONumber, approver: Approver, modifier: Modifier, comment: Comment});  
        }); 
        Ajax函数里data参数:data: JSON.stringify(model)
    * 3.3 若有返回值,Controller实现
        * return Json(返回的数据);//Json返回值类型System.Web.Mvc.JsonResult:System.Web.Mvc.ActionResult
        
* 4.参考
    * http://www.cnblogs.com/sunxi/p/4484440.html
    * http://www.cnblogs.com/BluceLee/p/3701283.html
    * http://www.cnblogs.com/wubh/p/6253358.html
    * http://blog.csdn.net/ydm19891101/article/details/44336951
    * http://blog.csdn.net/hanxuemin12345/article/details/38872807
    * http://blog.csdn.net/zjx86320/article/details/42555223

asp.net-webform

### ASP.NET常用类
* Page类
    * ASP.NET页面生命周期(所有Web页面都继承自System.Web.UI.Page类)
        * 1)客户机向Web应用程序发送一个页面请求
        * 2)服务器端Web应用程序接收这个请求,先看这个页面是否编译过,若未编译就编译这个Web页面成一个类(该类继承自Page类),然后实例化该类产生一个Page对象
        * 3)Page对象根据客户请求,把信息返回给IIS,然后信息由IIS返回给客户机(执行顺序:Page_Load()方法——(若有事件,执行事件对应的方法)——aspx页面上的服务器代码)
    * 常用属性和方法
        * IsPostBack(是否回传)if(!IsPostBack){}
        * (Request,Response,Server,Session,Application,ViewState)获取当前Page实例
        * MapPath(),ResolveUrl(),DataBind(),Dispose()
* Request类(获取发送请求端的各种信息)
    * System.Web.HttpRequest类(注意区分HttpWebRequest,此类可以模拟客户机发送请求,功能完整强大)
    * 常用属性和方法
        * Browser(浏览器信息)
        * Url
        * Files(客户端上传的文件集合)
        * Cookies(客户端发送的cookie集合)
        * Form(form表单以POST方式提交的数据集合)
        * QueryString(各种以GET方式提交的数据集合,包括以url地址?后的参数值)
        * ServerVariables(各种信息集合)
        * Request["参数名"]上述4种的集合,索引器
            public string this[string key]
            {
                get
                {
                    string str = this.QueryString[key];
                    if( str != null ) {
                        return str;
                    }
                    str = this.Form[key];
                    if( str != null ) {
                        return str;
                    }
                    HttpCookie cookie = this.Cookies[key];
                    if( cookie != null ) {
                        return cookie.Value;
                    }
                    str = this.ServerVariables[key];
                    if( str != null ) {
                        return str;
                    }
                    return null;
                }
            }
* Response类(Web服务器对客户机请求的响应),响应推送的内容在html文档之前
    * System.Web.HttpResponse类(区分HttpWebResponse)
    * 属性方法
        * Cache等等...
        * Redirect() 重定向到新的URL
        * Write() 将信息写入HTTP响应输出流
        * WriteFile() 将文件写入HTTP响应输出流
        * 其他Clear(),Close(),Flush(),End()等等...
* Server类(与服务器相关的信息)
    * System.Web.HttpServerUtility类
    * 属性方法
        * Execute() 执行指定虚拟路径的处理程序
        * HtmlDecode() 对Html文本解码
        * HtmlEncode() 对Html文本编码
        * UrlDecode() 对(Url中的客户机发送的已编码字符串)进行解码
        * UrlEncode() 编码字符串,以便通过Url从服务器通过HTTP可靠的发送到客户机
        * Transfer() 终止当前页的执行,并为当前请求开始执行新页
* Cookie类(Cookies是服务器把少量数据存储到客户机,和从客户机读取数据的一种技术)
    * System.Web.HttpCookie类
    * 属性方法
* Session类(为每个用户的会话存储信息)
* ViewState类

### 基本服务器控件
* Html的文本标签实在客户机浏览器引发和处理的,而服务器控件(有runat="server"属性)则是在客户机引发,服务端处理的
* 文本
    * Label
    * Literral静态文本
    * TextBox
    * HyperLink超链接
* 按钮
    * Button
    * LinkButton超链接按钮
    * ImageButton
* 图像
    * Image
    * ImageMap
* 选择
    * CheckBox复选
    * CheckBoxList复选列表
    * RadioButton单选
    * RadioButtonList单选列表
* 列表
    * ListBox列表
    * DropDownList下拉框列表
    * BulletedList项目列表
* 容器控件
    * Panel
    * MultiView
    * PlaceHolder
* 其他
    * Calendar日历
    * AdRotator动态广告
### 服务器验证控件
* RequiredFieldValidator必需项
* CompareValidator与某值比较
* RangeValidator范围检查
* RegularExpressionValidator模式匹配
* CustomValidator自定义方法验证

### 自定义服务器控件(.ascx)

### 数据绑定
* DataBind()方法:Page对象和所有Web控件成员的方法,DataBind()方法将所有子控件绑定到DataSource属性指定的数据源,父控件调用DataBind()方法时,所有子控件都会调用此方法,通常在Page_Load()方法里面调用Page对象的DataBind()方法,因为Page对象是页面上所有控件的父控件
* 简单绑定(可以在aspx页面上直接使用:此页面的类的字段,属性,方法,包含上述的表达式等)
    * <%#字段名%> <%#属性名%> <%#方法名(参数)%>
* 在后台代码中给容纳数据的控件(DropDownList,DataGrid等)的DataSource属性绑定对应的数

### 数据表格服务器控件
* GridView
* DetailView 结合GridView显示表格单行的详细信息
* Repeater 模板分块化的表格控件,自由度高
    /*<asp:Repeater>该控件的开始,所有项必须包含在内*/
    /*<ItemTemplate>此项必须要有,用来包含表体绑定的数据<tr><td>内容</td></tr>*/
    /*<HeaderTemplate><FooterTemplate>可以有,必须同时出现,<HeaderTemplate>用来放开头<table>和表头行<tr>,<FooterTemplate>用来放</table>*/
    /*后台<asp:Repeater>的id.DataSource=取到的数据集*/
    /*<%# Eval("字段名")%> 绑定列数据*/
    <asp:Repeater ID="Repeater1" runat="server">
        <HeaderTemplate>
            <table>
                <thead>
                    <tr>
                        <td>姓名</td>
                    </tr>
                </thead>
                <tbody>
        </HeaderTemplate>
        <ItemTemplate>
            <tr>
                <td><%# Eval("字段名") %></td>
            </tr>
        </ItemTemplate>
        <FooterTemplate>
            </tbody></table>
        </FooterTemplate>
    </asp:Repeater>
* DataList 类似Repeater,增加了选定项,编辑项,交替项等
* ListView 类似GridView,但可以使用类似Repeater的模板,高度自由化
* Chart(图表控件)新增

### 网站设计
* 母版页
* 网站导航
* 导航控件
* 主题
* 样式