zoukankan      html  css  js  c++  java
  • 细说Request与Request.Params

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

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

      回顾【我心目中的Asp.net核心对象】

      由于【我心目中的Asp.net核心对象】有对它们的一些介绍以及示例截图,无奈,有些人可能由于各种原因,没看到那段文字,这里我也只好再贴一次了:

      这二个属性都可以让我们方便地根据一个KEY去【同时搜索】QueryString、Form、Cookies 或 ServerVariables这4个集合。通常如果请求是用GET方法发出的,那我们一般是访问QueryString去获取用户的数据,如果请求是用 POST方法提交的,我们一般使用Form去访问用户提交的表单数据。而使用Params,Item可以让我们在写代码时不必区分是GET还是POST。 这二个属性唯一不同的是:Item是依次访问这4个集合,找到就返回结果,而Params是在访问时,先将4个集合的数据合并到一个新集合(集合不存在时 创建),然后再查找指定的结果。

      为了更清楚地演示这们的差别,请看以下示例代码:

    <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 ShowItem : 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("ShowItem.aspx?name=abc", true);


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

      页面在未提交前浏览器的显示:

      点击提交按钮后,浏览器的显示:

      差别很明显,我也不多说了。说下我的建议吧:尽量不要使用Params,不光是上面的结果导致的判断问题,没必要多创建一个集合出来吧,而且更糟糕的是写Cookie后,也会更新集合。

      正如我前面所说的客观原因:由于那篇博客中有更多有价值的对象要介绍,因此也就没有花太多的篇幅着重介绍这二个集合。 下面,我来仔细地说说它们的差别。

    实现方式分析

      前面的示例中,我演示了在访问Request[]与Request.Params[] 时得到了不同的结果。为什么会有不同的结果呢,我想我们还是先去看一下微软在.net framework中的实现吧。

      首先,我们来看一下Request[]的实现,它是一个默认的索引器,实现代码如下:

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

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

      Request.Params[]的实现如下:

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

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

      我们可以看到,这是二个截然不同的实现方式。也就是因为这个原因,在某些特殊情况下访问它们得到的结果将会不一样。

      不一样的原因是:Request.Params[]创建了一个新集合,并合并了这4个数据源,遇到同名的key,自然结果就会不同了。

      再谈Cookie

      在博客【我心目中的Asp.net核心对象】中,说到Request.Params[]时,我简单地说了一句:而且更糟糕的是写Cookie后,也会更新集合。 如何理解这句话呢?

      我想我们还是来看一下我们是如何写一个Cookie,并发送到客户端的吧。下面我就COPY一段 【细说Coookie】中的一段原文吧:

  • 相关阅读:
    一个你爱,一个爱你,你选择哪一个
    Flask 中的 SQLAlchemy 使用教程
    Flas-SQLAchemy数据库操作使用学习笔记
    Flask-SQLAlchemy获取一个字段里去掉重复的数据
    Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
    pycharm快捷键、常用设置、包管理
    [原创]python MySQLdb在windows环境下的安装、出错问题以及解决办法
    Highcharts下载与使用_数据报表图
    Markdown入门指南-指间阁
    Sublime Text3 配置markdown插件
  • 原文地址:https://www.cnblogs.com/tianguook/p/3880298.html
Copyright © 2011-2022 走看看