不拖控件ASP.NET——一般处理程序

    习惯了微软提供的一系列Web控件,用着很方便,最近看了一种新的方式不用拖控件就能实现同样的功能,究竟拖控件好还是不拖控件好,随着以后学习的深入,答案会慢慢揭晓,希望一直关注哦!今天我们来看看一般处理程序。

  1.      一般处理程序(HttpHandler)

    ?  引入

    我们从一个网站打开的流程讲起。如下图:

技术分享

    流程细说:用webForm开发一个模拟的登陆页面,用户打开登陆页面,填入相应的用户信息:用户名和密码,点击【登陆】按钮,浏览器将用户名和密码发送给网站服务器,网站服务器让负责处理登陆请求的asp.net处理程序来处理这个请求,处理程序判断用户名和密码是否正确,之后将处理结果返回给浏览器。

    上网的本质:上网就是从服务器向浏览器传送Html格式描述的网页,每次请求都带回来新的页面;页面中的图片、js、css在单独的请求中。

    注解:我们知道像Html文件、css文件以及javascript是由浏览器进行解析的,在上面的登陆流程中,基本上可以分为三部分:向服务器发请求(请求)—服务器进行处理渲染成html(处理)—返给浏览器并且画出来给客户端(响应)。

    ?  HttpHandler

    从上面的引入我们知道浏览器与服务器请求-处理-响应的交互方式,那么HttpHandler(一般处理程序)扮演的即是服务器处理者的角色,整个操作是:

    浏览器搜集用户操作向服务器发送请求——服务器处理请求并且把结果渲染成html文件——浏览器响应服务器的操作,并且把返回的结果进行解析和显示。

    ?  实例

    第一个例子

    此时如果没有挂到iis的网站的默认目录下需要手动输入地址,以及参数name和age即可

    此时httphandler.ashx代码为:

<strong><span style="font-family:Microsoft YaHei;font-size:14px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace handler
{
    /// <summary>
    /// TestHandler 的摘要说明
    /// </summary>
    public class TestHandler : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            //context.Response.ContentType = "text/plain";
            context.Response.ContentType = "text/html";
            string action = context.Request["name"];

            string isVIP=context.Request["isVIP"];
            int age = Convert.ToInt32(context.Request["age"]);
            context.Response.Write("<font color='red'>Hello "+action+"</font>");
            context.Response.Write("<font color='green'>我今年 " + age + "</font>");
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}</span></strong>

    此时效果是:

技术分享

    第二个例子

    我们发现每次手动输入参数的时候是很容易出现错误的,所以我们可以用html表单自动提交给服务器进行处理

    修改代码如下:

HTML页:

<strong><span style="font-family:Microsoft YaHei;font-size:14px;"><!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form action="TestHandler.ashx" method="post">
        姓名:<input type="text" name="name" /><br />
        年龄:<input type="text"name="age" /><br />
              <input type="checkbox"name="isVIP" />
              <div name="aaaaa">哈哈哈哈</div>
        <textarea name="msg"></textarea>
        <select name="Prov">
            <option value="bj">北京</option>
            <option value="tj">天津</option>
            <option value="sh">上海</option>
            
        </select>
        <ul> 
            <li><input  type="radio" name="gender" value="male"/>男</li>
            <li><input  type="radio" name="gender" value="female"/>女</li>
        </ul>
        <ul> 
            <li><input  type="radio" name="national" value="han"/>汉</li>
            <li><input  type="radio" name="national" value="man"/>满</li>
        </ul>
        <input type="submit" />
    </form>
</body>
</html>
</span></strong>

    一般处理程序:同上。

    操作步骤详解:

      1.      Html表单<form>可以自动给服务器提交参数(get是通过url,post是通过报文体),不用用户自己拼url。Action指定把表单内容提交给谁。即action和method指定了提交给哪个HttpHandler以及提交方式。

      2.      浏览器向服务器端提交数据,被提交数据的表单(input、select、textarea等)放到form中,form通过action属性设定表单被提交给哪个页面,为了在服务器端取出来表项的值,需要在HTML为表单元素设定name属性。

      3.      注意id是给js操作dom的,name才是提交给服务器用的。Id不能重复,name可以重复。

      4.      服务器端(此处是httphandler)用context.Request[“username”]来根据表单项的name来获取提交的属性值。

    特别注意:

      1.      点击提交按钮时是浏览器将用户填写的文本框等空间中的值“提取”出来发送给服务器,而不是服务器来读取用户填写的信息

      2.      可以被提交到服务器的标签具有以下的特性:

        A、 只能为Inputtextareaselect三种类型的标签。只有这些标签用户才可能修改值,<lable><p>、<font>,只是显示,没有提交到服务器的必要。input=submit的时候,只有被点击的按钮的value才会被提交。提交的表单的内容,会提交到服务器。(此外有一种隐藏控件input=hidden,是一种服务端控件,也会被提交到服务端,原因在于其在浏览器上映射成的是input控件,type="hidden"

        B、 只有三种标签的value属性的值才会提交给服务器,input标签的title、type等属性,只是显示,用户无法修改。

        C、 标签必须设定name属性,如果要将标签的value值提交到服务器,则必须为标签设定name值,提交到服务器的时候将会以“name=value的键值对的形式提交给服务器,name是给服务里用的,id是js操作dom用的,对于radiobutton,同name为一组,选中的radiobutton的值被提交到服务器。

        D、 放到form标签内,只有放到form标签内的才可能被提交到服务器。Form外的input等标签被忽略。

  2.      Get和post

    ?  区别

    1.      Get是通过url传递表单值的,post通过url看不到表单域的值;

    2.      Get传递的数据量是有限的,如果传递大数据量不能用get,比如type=”file’,<textarea>发表大段文章。Post则没有这个限制。但是post无法通过url在其他用户中还原,这样会显示不对。

    3.      Get方式url数据格式,服务器端文件名后跟着“?“,由于客户端可能向服务器端提交多个键值对,键值对之间用”&“进行分割,如果url存在汉字或者特殊字符,则需要对其进行编码。

    ?  示例显示

    在ie9用F12开启网络流量捕获即可

    Get请求标头中含有请求时发送的数据;请求正文为空:

技术分享

技术分享

    Post请求时发送的数据从标头字符串中,转移到请求正文中

技术分享

技术分享

  3.      http协议以及报文请求

    ?  协议

    1. 连接(Connection):浏览器和服务器之间传输数据的通道。一般请求完毕就关闭,http不保持连接,或称为短连接。这样的优点是可以增强服务器处理的客户端并发请求数;缺点是会降低服务器处理速度,因为建立连接的速度很慢。

    2. 请求(Request):浏览器向服务器发送的请求信息,包含请求的类型、数据、浏览器(客户端)的信息(语言、浏览器版本、IP地址)等。

    3. 响应(Response):服务器处理浏览器请求后返回的数据,包含请求是否成功、错误码等。

    ?  报文解析(请求一个页面比如csdn自己的)

      请求

         1、Get/HTTP/1.1表示向服务器用GET方式请求page,使用Http1.1协议。

    2、Accept-Language表示浏览器支持的语言种类。User-Agent为浏览器的版本信息。

    3、Referer:为(图片、js、css文件等)来源页面、所属页面。

技术分享

    响应

      响应码:“200”OK 表示请求响应成功;

      “302”:Found表示重定向,Response.Redirect()使浏览器再请求一次重定向的地址,重定向请求方式为Get。

      “404”:Not Found表示未找到所请求页面。

      “500”:表示服务器内部出现错误

 

    Content-Type:text/html:表示返回数据的类型,服务器通过此属性告诉客户端响应的数据的类型,这样浏览器就根据返回数据的类型来进行不同的处理,如果是图片类型(image/gif)就显示,如果是文本类型(text/plain)就直接显示纯文本代码等等。可以自己试试比较看设成text/html和text/plain的区别。动动手吧。

  4.      总结

    了解了浏览器和服务器端是如何工作的,更加便于我们理解代码,之前我们一直用控件拖拽进行开发,看似很方便,其实在拖拽控件的时候,控件会给我们生成一些其他的东西。

    在这里我们利用了html+httphandler实现了浏览器和服务端的交互,其实相当于web窗体,我们知道web控件都是能够提交到服务器,因为有runat=“server“,但是我们在此时利用form表单提交到handler进行处理,此时hanler相当于服务端,其好处还需要在以后的深入学习中慢慢体会,学习仍在继续,请继续关注~



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。