客户端的数据来源:QueryString, Form, Cookie Request[]与Request.Params[]

在ASP.NET编程中,有三个比较常见的来自于客户端的数据来源:QueryString, Form, Cookie 。 我们可以在HttpRequest中访问这三大对象。

QueryString: 获取包含在URL中的一些参数; 获取get方式提交的表单数据 (在提交表示如不指定method类型,则默认为get方式)

Form: 获取post方式提交的表单数据

Cookie: 获取一些会话状态以及其它的用户个性化参数信息。

除了这三大对象,HttpRequest还提供ServerVariables来让我们获取一些来自于Web服务器变量。

一般情况下,如果我们在事先就能明确知道某个参数是来源于哪个集合,那么直接访问那个集合,问题也就简单了。 然而,更常见的数据来源通常只会是QueryString, Form ,而且尤其是当在客户端使用Jquery的$.ajax()这类技术时, 可以很随意地将参数放到QueryString或者是Form中,那么,服务端通常为了也能灵活地应对这一现况, 可以使用Request[]与Request.Params[] 这二种方式来访问这些来自于用户提交的数据。然而 Request[]与Request.Params[] 有什么差别??

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;
    }
}

Request 实现方式

这段代码的意思是:Request 根据指定的key,依次访问QueryString,Form,Cookies,ServerVariables这4个集合,如果在任意一个集合中找到了,就立即返回。

public NameValueCollection Params
{
    get
    {
        //if (HttpRuntime.HasAspNetHostingPermission(AspNetHostingPermissionLevel.Low))
        //{
        //    return this.GetParams();
        //}
        //return this.GetParamsWithDemand();

        // 为了便于理解,我注释了上面的代码,其实关键还是下面的调用。
        return this.GetParams();
    }
}
private NameValueCollection GetParams()
{
    if( this._params == null ) {
        this._params = new HttpValueCollection(0x40);
        this.FillInParamsCollection();
        this._params.MakeReadOnly();
    }
    return this._params;
}
private void FillInParamsCollection()
{
    this._params.Add(this.QueryString);
    this._params.Add(this.Form);
    this._params.Add(this.Cookies);
    this._params.Add(this.ServerVariables);
}

Request.Params 的实现方式

它的实现方式是:Request.Params 先判断_params这个Field成员是否为null,如果是,则创建一个集合,并把QueryString,Form,Cookies,ServerVariables这4个集合的数据全部填充进来, 以后的查询都直接在这个集合中进行。

并且在网页中写入cookie的时候,requset.Params也会发生变化(具体原因不做陈述,可参考作者原文)

实例:

新建一个context.aspx网页

<head runat="server">
    <title></title>
</head>
<body>
    <p>Item结果:<%= this.ItemValue %></p>
    <p>Params结果:<%= this.ParamsValue %></p>

    <hr />

    <form action="<%= Request.RawUrl %>" method="post">
        <input type="text" name="name" value="123" />
        <input type="submit" value="提交" />
    </form>
</body>

前台代码

public partial class context : System.Web.UI.Page
    {
        protected string ItemValue;
        protected string ParamsValue;

        protected void Page_Load(object sender, EventArgs e)
        {
            string[] allkeys = Request.QueryString.AllKeys;
            if (allkeys.Length == 0)
                Response.Redirect("context.aspx?name=abc", true);

            ItemValue = Request["name"];
            ParamsValue = Request.Params["name"];
        }
    }

后台代码

网页提交前: 

网页提交后: 

原因是在使用Request[]来获取一个key的时候,会首先检索Questring,在检索到这个key的时候即返回,所以在提交后Item的结果依然网页url后面的name

而Request.Params[] 会将所有符合条件的key全部添加进入,所以在提交后,Params的结果是:url后面的name+input的name

前面我解释了NameValueCollection的工作原理,并揭示了Request.Params["name"]; 得到【abc,123】这个结果的原因。
事实上,这个怪异的结果有时并不只是Params会有,同样的故事还可能由QueryString, Form这二个对象上演(最终会在Request[]那里也有体现)。

网页引用:http://www.cnblogs.com/fish-li/archive/2011/12/06/2278463.html

时间: 2024-08-24 10:17:09

客户端的数据来源:QueryString, Form, Cookie Request[]与Request.Params[]的相关文章

细说 Request[]与Request.Params[]

细说 Request[]与Request.Params[] 阅读目录 开始 回顾博客原文 实现方式分析 再谈Cookie 再谈NameValueCollection 再谈QueryString, Form 如何处理冲突 Request[]还是Request.Params[] ?? 今天我来谈一谈容易被人混淆的二个集合:Request[]与Request.Params[] 这二个集合我在博客[我心目中的Asp.net核心对象]中就提到过它们, 而且还给出了一个示例,并以截图的形式揭示过它们的差别.

细说Request与Request.Params

在ASP.NET编程中,有三个比较常见的来自于客户端的数据来源:QueryString, Form, Cookie .我们可以在HttpRequest中访问这三大对象,比如,可以从QueryString中获取包含在URL中的一些参数,可以从Form中获取用户输 入的表单数据,可以从Cookie中获取一些会话状态以及其它的用户个性化参数信息.除了这三大对象,HttpRequest还提供 ServerVariables来让我们获取一些来自于Web服务器变量.通常,这4个数据来源都很明确,我想没人会混

request和request.form和request.querystring的区别

Request.Form是获取以POST方式提交的表单数据: Request.QueryString主要是获取地址栏参数或者以Get方式提交的数据 而Request则包含以上两种方式,会在Request.QueryString和Request.Form中都查询一遍变量.但是优先获取GET方式提交的数据,即Request.QueryString Request:包含以上两种方式(优先获取GET方式提交的数据),它会在QueryString.Form.ServerVariable中都搜寻一遍. 而且

asp.net Request、Request.Form、Request.QueryString的区别(转)

Request.Form:获取以POST方式提交的数据. Request.QueryString:获取地址栏参数(以GET方式提交的数据). Request:包含以上两种方式(优先获取GET方式提交的数据),它会在QueryString.Form.ServerVariable中都搜寻一遍. 有时候会得到不同的结果.如果仅仅需要Form中的数据,但是使用了Request而不是Request.Form,那么程序将在QueryString.ServerVariable中也搜寻一遍.如果其中有同名的项,

Request、Request.Form和Request.QueryString的区别

request本身是一个系统的静态对象,本身也可以作为数组调用,比如request("abc")就是获取request数组中键值"abc"对应的值,而这个数组又不是固定的,而是多个数组的集合,其中包含了(QueryString ,Form ,Cookies ,ClientCertificate,ServerVariables )这几个服务器变量数组的值,也就是说,通过request可以依次遍历这几个数组并返回对应的值,使用起来很是方便,一劳永逸.  而request

Rquest Request[&quot;&quot;];Request.Form[&quot;&quot;];Request.QueryString[&quot;&quot;]

<1> HTMLPage.htm页面  [请求页] <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> </head> <body> <!--如果不指定method属性,那么method的默认值就是get--> <form action="Handler.ashx" method=&q

Request.QueryString/Form 返回值类型 与 CInt()

一直以为 Request.QueryString/Form 找不到指定的变量时会返回空字符串. 其实不然,Request.QueryString/Form 找不到指定的变量时,返回值的类型是 Empty. Empty 是 Variant 的子类型. CInt() 不接受空字符串,但是却可以接受 Empty 类型. 下面是关于 VBScript 数据类型的一些介绍. VBScript 只有一种数据类型,称为 Variant. Variant 是一种特殊的数据类型,根据使用的方式,它可以包含不同类别

Request.Form和Request和Request.querystring的区别

Request.Form是获取以POST方式提交的表单数据: Request.QueryString主要是获取地址栏参数或者以Get方式提交的数据 而Request则包含以上两种方式,会在Request.QueryString和Request.Form中都查询一遍变量.但是优先获取GET方式提交的数据,即Request.QueryString Request:包含以上两种方式(优先获取GET方式提交的数据),它会在QueryString.Form.ServerVariable中都搜寻一遍. 而且

controller获取客户端请求数据

在学习SpringMVC之前,客户端的请求数据一般是靠request的getParameter方法获取,获取到的数据类型为String类型,需要强制转换为需要的数据类型. 在controller中也可以用这种方式获取客户端数据. //浏览器访问路径为http://127.0.0.1:8001/web02/request?name=name @RequestMapping(path = "/request", method = RequestMethod.GET) public Mode