说说Request.Params[key]和Request[key]
摘要
其实你一看到,就应该会想到,这个不简单吗,不就是服务端接收参数的两种方式吗?是的。在asp.net编程中,QueryString、Form、Cookie是三种比较常见的接收客户端参数的方式。QueryString:接收包含在url中的参数。Form:接收表单数据。Cookie可以获取会话状态中保存的信息(大部分情况下用来存储用户信息)。除了这些外,HttpRequest还提供了ServerVariables来让我们获取一些来自web服务器变量。
问题来了?
其实通常情况下,我们知道传递的参数来自哪,可以使用QueryString,Form明确的来接收url或者表单中的数据。但服务端接口为了既可以通过url获取参数,又可以通过Form获取参数,该如何呢?(当然,规定调用方必须通过url或者Form某一种方式除外)。那么就要用到Request[]或者Request.Params[]这两种方式获取来自客户端提交的数据了。但,到底用哪个?
下面先看一个例子:
public ActionResult Index()
{
ViewBag.requestParams = Request.Params["name"]; ;
ViewBag.request = Request["name"];
return View();
}
有这样一个action,我们用来获取url中传递的参数name。这两种方式有什么区别呢?你猜....

到这里,你会发现,这两种方式,不一样吗?都可以接收正确的参数。但还是有特殊情况。
我们添加一个cookie的action,向客户端添加一个以name为键的值,代码如下:
public string Cookie()
{
Response.Cookies.Add(new HttpCookie("name", "wolfy") { Expires = DateTime.Now.AddDays() });
return "cookie writes successfully!";
}

然后我们再访问一下,Index页面。

发现了不同了吧。你可以说,你这种方式太奇葩了,哪有那么巧参数名称一样,但一个项目多个人来合作完成,参数名称名称相同还是很有可能的。所以不小心就会出现这种问题,不小心就会中招,掉坑里的。
到底为什么?
源码:https://github.com/Microsoft/referencesource
我们先看一下Params的实现。
// Params collection - combination of query string, form, server vars
// Gets a combined collection of QueryString+Form+ ServerVariable+Cookies.
public NameValueCollection Params {
get {
if (HttpRuntime.HasAspNetHostingPermission(AspNetHostingPermissionLevel.Low))
return GetParams();
else
return GetParamsWithDemand();
}
}
private NameValueCollection GetParams() {
if (_params == null) {
_params = new HttpValueCollection();
FillInParamsCollection();
_params.MakeReadOnly();
}
return _params;
}
[AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.Low)]
private NameValueCollection GetParamsWithDemand()
{
return GetParams();
}
// Params collection support
private void FillInParamsCollection() {
_params.Add(this.QueryString);
_params.Add(this.Form);
_params.Add(this.Cookies);
_params.Add(this.ServerVariables);
}
通过上面的代码可以看到Params是NameValueCollection键值对类型的只读属性,在FillInParamsCollection方法中,将QueryString,Form,Cookies,ServerVariables加入到了字段中。这就说明了上面的例子中,为什么Params[key]会取到QueryString和cookie里面的值了。
我们在看一下Request[key]的实现。
// Default property that goes through the collections
// QueryString, Form, Cookies, ClientCertificate and ServerVariables
public String this[String key] {
get {
String s; s = QueryString[key];
if (s != null)
return s; s = Form[key];
if (s != null)
return s; HttpCookie c = Cookies[key];
if (c != null)
return c.Value; s = ServerVariables[key];
if (s != null)
return s; return null;
}
}
可以看到Request[key]的实现方式,查找顺序是QueryString,Form,Cookies,ServerVariables,直到找到然后直接返回。
总结
一直对Request.Params[key]和Request[key]比较困惑,在这里也掉过坑,最近在项目中,又看到了,所以,就趁着扒了一下源码。
感兴趣的可以或者对以前用法不太理解的可以扒一扒源码,或许可以可以解惑。
资料
https://github.com/Microsoft/referencesource
说说Request.Params[key]和Request[key]的更多相关文章
- Request.Params用法
使用Request.Params["id"]来获取参数是一种比较有效的途径.有三种方式可以进行参数传递:(1). Form (2). ?id= (3).cookierequest. ...
- Request.params,Request.form,Request.querystring区别(转)
自己总结:---大致意思是: 1.传参的方式分为:get方式传参,post方式传参,request.cookies和request.servervariables 2.这几种获取参数方式获取的都是一个 ...
- django学习——request.POST.get(‘key’) 、 request.GET.get('key', '')
request.POST是用来接受从前端表单中传过来的数据,比如用户登录过程中传递过来的username.passwrod等字段.返回类型是字典: 在后台进行数据获取时,有两种方法(以username ...
- 客户端的数据来源:QueryString, Form, Cookie Request[]与Request.Params[]
在ASP.NET编程中,有三个比较常见的来自于客户端的数据来源:QueryString, Form, Cookie . 我们可以在HttpRequest中访问这三大对象. QueryString: 获 ...
- 细说Request与Request.Params
在ASP.NET编程中,有三个比较常见的来自于客户端的数据来源:QueryString, Form, Cookie .我们可以在HttpRequest中访问这三大对象,比如,可以从QueryStrin ...
- csharp: Request.Form,Request.QueryString,Request.Params,Request.Cookies
/// <summary> /// Request.Form,Request.QueryString,Request.Params /// http://msdn.microsoft.co ...
- Request[]与Request.Params[] 差别
Request[]与Request.Params[] ,这二个属性都可以让我们方便地根据一个KEY去[同时搜索]QueryString.Form.Cookies 或 ServerVariables这4 ...
- C#中 Request, Request.params , Request.querystring , Request.Form 区别 与联系用法
C#中 Request, Request.params , Request.querystring , Request.Form 区别 与联系用法? Request.params , Request ...
- Asp.net中request.QueryString与request.Params的区别 【转】
Request.Form:获取以POST方式提交的数据(接收Form提交来的数据): Request.QueryString:获取地址栏参数(以GET方式提交的数据) Request:包含以上两种方式 ...
随机推荐
- WebApp 框架
Razor 在WebApp 框架的运用 前面有两章介绍了WebApp框架<WebApp MVC,“不一样”的轻量级互联网应用程序开发框架>和<WebApp MVC 框架的开发细节 ...
- 在vi中使用perltidy格式化perl代码
格式优美的perl代码不但让人赏心悦目,并且能够方便阅读. perltidy的是sourceforge的一个小项目,在我们写完乱七八糟的代码后,他能像变魔术一样把代码整理得漂美丽亮,快来体验一下吧!! ...
- Office 365 – Exchange Online examples
原文 Office 365 – Exchange Online examples 2012 is upon us and here’s wishing you all a very happy and ...
- android:由URL载入中ImageView
两种方法: 方法一: Bitmap bimage= getBitmapFromURL(bannerpath); image.setImageBitmap(bimage); public static ...
- SQLCMD的介绍
原文:SQLCMD的介绍 sqlcmd -S SERVERNAME -U USERNAME -P PASSWORD -i filename.sql 下面的内容是详细介绍sqlcmd的,有兴趣的朋友可以 ...
- 用批处理文件自动备份文件及文件夹,并自动删除n天前的文件
原文:用批处理文件自动备份文件及文件夹,并自动删除n天前的文件 ---恢复内容开始--- 下是备份的批处理,添加到"计划任务"中,设定时间自动运行 复制代码 代码如下:@echo ...
- IOC容器在框架中的应用
IOC容器在框架中的应用 前言 在上一篇我大致的介绍了这个系列所涉及到的知识点,在本篇我打算把IOC这一块单独提取出来讲,因为IOC容器在解除框架层与层之间的耦合有着不可磨灭的作用.当然在本系列前面的 ...
- 解决ZF2_PATH environment
本方法基于:ZendFramework 2.1.4版本在WIN7下构建,其他版本的安装方式相差不大. 操作之前您需要搭建好PHP运行环境,保证PHP版本不低于PHP 5.3.3,并且去http://f ...
- .NET MVC4 实训记录之七(实现资源的自主访问后续)
我们在上一篇中讨论了如何利用ModelMetadata实现国际化资源文件访问,但也留下了一些问题,即:如何利用ModelMetadata实现相同类型的属性信息的个性化资源显示.本人没有找到合适的方案, ...
- wcf实例模型(随记)
-----------------------------------------实例模型: 1.InstanceContentextMode: -------PerCall(单调):无状态,每次调用 ...