ASP.NET学习笔记

ASP.NET学习笔记

1.ASP.NET需要学习的内容.
    一般处理程序HttpHandler
    模板引擎
    WebForm(aspx)
    ASP.NET MVC

    需要的基础知识: C#,ADO.NET,HTML,JavaScript。
    需要的工具: 浏览器Chrome。开发工具VS2010,.Net3.5。SQL Server2005.

2.一个网站打开流程
    请求、处理、响应.

3.一般处理程序
    VS2010新建/项目/Visual C#/Web/ASP.NET 空Web应用程序.
    解决方案/添加/新建项/Visual C#/Web/一般处理程序
    如果使用Chrome浏览器调试: 项目中新建一个HTML文件,右键点击浏览方式,选择Chrome浏览器。

    请求参数
    (1)浏览器中使用参数 http://localhost:47937/Handler1.ashx?name=test,或者使用表单提交参数.
    (2)一般处理程序中处理请求public void ProcessRequest(HttpContext context):
       得到请求参数: context.Request["name"]

4.关于表单
    表单中哪些标签的哪些值会被提交给服务器:
    只有input、textarea、select三种标签的value属性值才会提交给服务器.
    标签必须设定name属性,提交到服务器时才会以键值对的方式提交给服务器.
    对于RadioButton相同name的为一组,选中的RadioButton的value被提交到服务器.
    放到form标签内,只有放到form标签内的标签才会被提交到服务器.

5.Get与Post.
    GET(默认值)是通过URL传递表单值,POST传递的表单是隐藏到http报文中,URL看不到.
    GET传递的数据量是有限的,传递大数据量不能用GET,POST没有这个限制,但POST无法通过URL定位网页内容。
    GET方式URL数据格式: 服务端文件名后跟?,键值对之间用&分割,如果URL中有汉字和特殊符号,则需要对URL进行编码.

6.Http协议
    Http协议的几个概念:
    连接(Connection): 浏览器和服务器之间传输数据的同道.一般请求完毕就关闭,http不保持连接。不保持连接会降低处理速度,保持连接会降低服务器处理的客户端请求数,不保持连接服务器可

以处理更多请求。
    请求(Request): 浏览器向服务器发送的请求消息,包含请求的类型、请求的数据、浏览器的信息(语言、版本等).
    响应(Response): 服务器对浏览器请求返回的数据,包含是否成功、错误码等。

    Http协议报文:
    请求
    GET/HTTP/1.1 表示向服务器用GET方式请求页面,使用HTTP/1.1协议
    User-Agent   浏览器的版本信息
    Referer:     来源页面.
    响应:
    响应码: 200: OK, 404,没找到, 302 Found暂时转移,用于重定向,Response.Redirect会让浏览器再请求一次重定向的地址,重定向的请求是Get方式.
    Content-Type: text/html;charset=utf-8 表示返回数据的类型.
    服务器通过Content-Type告诉客户端响应的数据的类型,这样浏览器就根据返回数据的类型来进行不同的处理,如果是图片类型就显示,如果是文本类型就直接显示内容,如果是html类型就用浏

览器显示内容,常用Content-Type: text/HTML、image/GIF、image/JPEG、text/plain、text/javascript.

7.重定向(Redirect)
    Redirect是向浏览器返回302,通知浏览器重新访问新网址,浏览器街道命令后访问新网址。新网址为响应头Location指定的内容。
    重定向在浏览器看到的网址是有变化的.
    context.Response.Redirect("http://www...");

8.模板引擎Nvelocity
    有几种模板引擎: Nvelocity、StringTemplate、RazorEngine.
    Nvelocity的网站
     http://www.castleproject.org/download/
     http://sourceforge.net/projects/nvelocity/
    Nvelocity使用步骤: 编写HTML模板 -> 提供数据 -> 渲染成需要的HTML.

    (1)模板文件:/templates/login.html
    <html>
    <head>
        <title></title>
    </head>
    <body>
        <form action="Login.ashx">
            <input type="text" name="username" value="$username"/>
            <input type="text" name="password" value="$password"/>
        </form>
    </body>
    </html>

    (2)一般处理程序Login.ashx
    Nvelocity基本用法代码:
    public class Loginashx : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";

            VelocityEngine vltEngine = new VelocityEngine();
            vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER,"file");
            vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates")); //模板文件所在的文件夹
            vltEngine.AddProperty("file.resource.loader.cache", true);
            vltEngine.Init();

            VelocityContext vltContext = new VelocityContext();
            vltContext.Put("username", "test");  //设置参数,在模板中可以通过$username形式来引用
            vltContext.Put("password", "123");

            Template vltTemplate = vltEngine.GetTemplate("login.htm");
            System.IO.StringWriter vltWriter = new System.IO.StringWriter();
            vltTemplate.Merge(vltContext, vltWriter);
            string html = vltWriter.GetStringBuilder().ToString();

            context.Response.Write(html);

        }
    }

9.Nvelocity输出对象的属性.
    当处理程序中使用VelocityEngine.Put(key,value)设置属性参数后,可以在模板中使用$key形式来使用数据。
    给模板设置的属性如果有属性,则还可以进一步获取: $data.Person.Name.
    如果对象有一个字符串索引器,则还可以"$data.索引器值"的方式通过索引器获取值。
    Dictiorary<string,string> dict = new Dictiorary<string,string>()
    dict["tom"] = "北京"
    dict["jack"] = "上海"
    dict["gym"] = "广州"
    vltContext.Put("ps", dict);
    模板中使用$ps.tom访问.
    Nvelocity中解析jquery代码$.ajax()中的$.的时候把$理解成了Nvelocity的$特殊符号,应对方法是用jQuery代替$.

    把DataTable传递给NVelocity的时候要传递DataTable.Rows
    为减少每次解析模板的时间,建议启用NVelocity缓存

10.Nvelocity高级:
    1.foreach语句
    #foreach($element in $list)
      this is $element
    #end
    2.条件语句
    #if(condition)
    #elseif(condition)
    #else
    #end
    3.包含另一个文件
    #include
      #include("foot.htm"),文件内容会包含进来,不会解析其中的NVelocity元素.
    #parse也可以包含另一个文件,但是会解析其中的NVelocity元素,被包含的文件继承父模板中的参数。可以实现"网站头体一致、左侧菜单"等效果。

11.封装Nvelocity的处理.
    Nvelocity封装,用匿名类传模板解析的参数.
    var news = new {Title="",Author="",Msg=""};
    vltContext.Put("data", news);

12.数据库连接字符串
    Web.config:
<configuration>
  <connectionStrings>
    <add name="test" connectionString="Data Source=.;Initial Catalog=test;User Id=userid;Password=password;"/>
  </connectionStrings>
</configuration>

13.通过URL传递状态
    两个页面之间传递数据最好、后续麻烦最少、最简单的方法就是通过URL传递.
    增删改查页面
    优点:简单、直接,明确知道发给谁,数据不会乱。缺点:如果多个页面或者不确定页面之间要传那么就需要每次跳转都带着,不保密。

    可以通过表单的隐藏字段传递状态,但一般不建议这么做。

14.Cookie
    因http是无连接的(请求响应之后即断开),所以不能保持状态。Cookie是为多次请求响应之间传递状态和数据而设计的。
    Cookie保存在浏览器端的电脑中,是以键值对的形式存放。Cookie可以被清除。
    Cookie是和站点相关的,浏览器会在每次向服务器请求的时候除了发送表单参数外,还会将和站点相关的所有Cookie都提交给服务器,是强制性的。然后在服务器端读取、修改。
    服务器返回数据除了普通的html数据外,还会返回修改的Cookie,浏览器把拿到的Cookie值更新到本地浏览器的Cookie就可以了.
    如果不设定Expires那么生命周期则是关闭浏览器则终止,否则最多到Expires的时候终止.
    Cookie的缺点是不能存储过多信息,不能存储机密信息.
    Cookie无法跨不同的浏览器。

    服务器端控制Cookie:
    设置值: context.Response.SetCookie(new HttpCookie("UserName",username));
    读取值: username = context.Request.Cookies["UserName"].Value;

    Cookie有效期:
    HttpCookie cookie1 = new HttpCookie("Age", "30");
    cookie1.Expires = DateTime.Now.AddHours(2);
    context.Response.SetCookie(cookie1);

15.Session原理
    由于用Cookie机制来保持状态(例如登录状态),Cookie保存在客户端,存在安全性问题,需要一种服务器端的Cookie机制即Session机制。
    自己实现服务器端的Cookie机制: Cookie不能存储机密数据。如果想存储数据,可以保存一个Guid到Cookie中,然后在服务器中建立一个以Guid为Key、复杂数据为Value全局静态Dictionary,放

到Application中。这个Guid就相当于用户的一个令牌。
    ASP.NET已经内置了Session机制,原理和自己实现服务器端的Cookie机制类似,普通的HttpHandler要能够操作Session.要实现IRequiresSessionState接口。
    Cookie是存在客户端,Session是存在服务器端,目的是一样的: 保存和当前客户端相关的数据(当前网站的任何一个页面都能取到Session、Cookie).
    Session有自动销毁机制,如果一段时间内浏览器没有和服务器发生任何的交互,则Session会定时销毁,这也是为什么一段时间不操作,系统就会自动退出。
    Session实现登录。
    Session的实质: 由于Web是无状态的,Session实质是借助Cookie来实现的,客户端浏览器在发出请求后,web服务器会给客户端浏览器一个唯一标识的Cookie,客户端浏览器下次再请求时,会带

上这个唯一标识的Cookie.如果在浏览器把Cookie清除,这个Session就没有了。所以实质是借助Cookie来实现Session.

    //登录时保存Session
    public class Login : IHttpHandler, IRequiresSessionState
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";

            string username = context.Request["username"];
            string password = context.Request["password"];

            context.Session["LoginUser"] = username;  //验证帐号后保存Session,object类型.
            context.Response.Redirect("MainPage.ashx");
        }
    }

    //其它页面读取检查Session.
    public class MainPage : IHttpHandler, IRequiresSessionState
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";
            if (context.Session = null)
            {
                context.Response.Redirect("Login.ashx");
            }
            else
            {
                string loginuser = (string)context.Session["LoginUser"];
                if (string.IsNullOrEmpty(loginuser))
                {
                    context.Response.Redirect("Login.ashx");
                }
                else
                {
                    context.Response.Write(loginuser);
                }
            }
        }
    }

16.AJAX(Asynchronous JavaScript and XML,异步JavaScript和XML).
    AJAX是一种进行页面局部异步刷新的技术。AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
    用AJAX向服务器发送请求和获得服务器返回的数据并且更新到界面中,不是整个页面刷新,而是在HTML页面中使用JavaScript创建XMLHTTPRequest对象来向服务器发出请求以及获得返回的数据,

就像JavaScript版的WebClient一样,在页面中由XMLHTTPRequest来发出http请求和获得服务器的返回数据,这样页面就不会刷新了。
    XMLHTTPRequest是AJAX的核心对象。

    ajax文件:js/ajax.js
    function ajax(url, onsuccess)
    {
        var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); //创建XMLHTTP对象,考虑兼容性。
        xmlhttp.open("POST", url, true); //准备向服务器发出Post请求(GET可能会有缓存问题),知识准备,未发出请求

        //监听onreadystatechange事件,AJAX是异步的,并不是等到服务器端返回才继续执行
        xmlhttp.onreadystatechange = function ()
        {
            if (xmlhttp.readyState == 4) //readyState: 2-请求已发送正在处理中, 3-响应中已有部分数据可用了,但是服务器还没有完成响应的生成, 4-服务器返回完成数据了
            {
                if (xmlhttp.status == 200) //如果Http状态码为200则是成功
                {
                    onsuccess(xmlhttp.responseText);
                }
                else
                {
                    alert("AJAX返回错误!");
                }
            }
        }
       
        //不要以为if (xmlhttp.readyState == 4) 在send之前执行!!!!
        xmlhttp.send(); //发送请求。并不等服务器端返回。监听事件onreadystatechange会返回信息.
    }

    html文件内容:
    <html>
    <head>
        <title></title>
        <script type="text/javascript" src="js/ajax.js"></script>
        <script type="text/javascript">
            function cai()
            {
                ajax("ZanCai.ashx?action=Cai", function (resText)
                {
                    document.getElementById("CaiCount").innerHTML = resText;
                });
            }
        </script>
    </head>
    <body>
    <video src="diaosi.mp4" autoplay controls></video>
        <p><input type="button" name="Zan" value="赞" onclick="zan()" /><label id="ZanCount"></label></p>
        <p><input type="button" name="Cai" value="踩" onclick="cai()" /><label id="CaiCount"></label></p>
    </body>
    </html>

17.Json(JavaScript Object Notation).
    Json和xml一样都是一种数据交换格式,Json基于JavaScript的一个子集,采用完全独立于语言的文本格式,是一种轻量级的数据交换格式。
    JSON语法规则:
    JSON 语法是 JavaScript 对象表示法语法的子集。
    数据在名称/值对中     "firstName" : "John"
    数据由逗号分隔
    花括号保存对象        {key:value,key:value,...}
    方括号保存数组        ["java","javascript","vb",...]

    var people = { "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
                                    { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" },
                                    { "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
                                  ],
                   "authors": [ { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
                                { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
                                { "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
                              ],
                   "musicians": [ { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
                                  { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
                                ]
                  }

    people.programmers[0].lastName;

    people.authors[1].genre         // Value is "fantasy"
    people.musicians[3].lastName    // Undefined. This refers to the fourth entry, and there isn't one
    people.programmers[2].firstName // Value is "Elliotte"

    people.musicians[1].lastName = "Rachmaninov";


    JsonTest1.ashx
    public class JsonTest1 : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";

            List<Person> list = new List<Person>();
            list.Add(new Person { Name="yzk",Age=32,Email="[email protected]"});
            list.Add(new Person { Name = "tom", Age = 12, Email = "[email protected]" });
            list.Add(new Person { Name = "lily", Age = 18, Email = "[email protected]" });
            JavaScriptSerializer jss = new JavaScriptSerializer();
            string json = jss.Serialize(list);
            //string json = jss.Serialize(new Person { Name = "lily", Age = 18, Email = "[email protected]" });
            context.Response.Write(json);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

    JsonTest1.htm
    <html>
    <head>
        <title></title>
        <script src="js/json2.js" type="text/javascript"></script>
        <script src="js/ajax.js" type="text/javascript"></script>
        <script type="text/javascript">
            function go()
            {
                ajax("JsonTest1.ashx", function (resTxt)
                {
                    var persons = JSON.parse(resTxt);
                    for (var i = 0; i < persons.length; i++)
                    {
                        var p = persons[i];
                        alert("姓名:" + p.Name + ";年龄:" + p.Age);
                    }
                });
            }
        </script>
    </head>
    <body onload="go()">
    </body>
    </html>

18.ValidateRequest
    ASP.NET4.0之后会对ashx检测中默认对请求的数据进行校验,如果数据中有<>等有潜在XSS攻击的字符,则会报错。对于一些CMS系统等需要提交HTML内容的地方要关闭它,修改web.config.在

<system.web>节点中加入<httpRuntime requestValidationMode="2.0" />,把验证变更为2.0模式。(aspx在页面顶部的Page中还要加入ValidateRequest="false")。
    XSS跨站脚本(Cross-site scripting)
<configuration>
   <system.web>
      <httpRuntime requestValidationMode="2.0" />
   </system.web>
</configuration>

19.可视化编辑器CKEditor
    CKeditor是一个使用在网页上的所见即所得文字编辑器,由JavaScript、CSS、图片等构成。

你可能感兴趣的:(ASP.NET学习笔记)