[转载]ASP.NET MVC :Action参数绑定的数据源优先顺序

[转载]ASP.NET MVC :Action参数绑定的数据源优先顺序 – 阿不 – 博客园.

ASP.NET MVC框架从还未正式发布时就已经成为了我工作的方向和重点,而它也在不断的完善和发展,前两天,ASP.NET MVC2 RTM已经发布了,MVC2主要是在提高我们基于ASP.NET MVC框架之上的WEB程序开发效率上下功夫,新增了很多的常用功能的集成,API的优化以及IDE的改善支持等方面。随着开发效率的不断提高和资源的不 断丰富,以及MVC框架本身所具备的天生的优点,我相信未来ASP.NET平台的WEB开发将会逐步走向MVC方向。至少在ASP.NET Mobile Web的开发中,Webform已经被MVC所取代,在未来的ASP.NET中,包含Mobile WebForm 控件的System.Web.Mobile.dll程序将会被标上过期标志,以及发布新的基于ASP.NETMVC的Mobile Web开发指导。同时,ASP.NET MVC2仍然开放了它的所有源码,源码下载(最下方的mvc2-ms-pl.zip文件)。

以上是关于ASP.NET MVC的一些感想,并不是我本文的重点。本文要叙述的是关于ASP.NET MVC Action参数值来源的优先顺序问题。我们知道在ASP.NET MVC的Controller Action函数中,我们可以添加一些参数,不管这些参数的类型是简单类型,还是复杂类型的对象,MVC都会自动从请求的上下文中寻找全适匹配的值自动赋 值到参数中。我们还知道,一次的HTTP请求中,传值的方式可以有很多种,可以用QueryString,Header,Post Form等等。在MVC中,还可能会有经过Route解析过的Route Values。我们Action的参数值来源是从哪些传值方式中取值的呢?他们的优先级又是如何呢?这是很早以前一位同事提出的问题。花了几分钟阅读了一 下MVC关于赋值绑定的代码,大家可以从ValueProviderDictionary里的一段代码中找到答案。这段代码是获取要做为 ModelBinder绑定的数据源,ModelBinder在绑定参数据值所需的数据源就是从这里得到的:

01 private void PopulateDictionary()
02 {
03 CultureInfo currentCulture = CultureInfo.CurrentCulture;
04 CultureInfo invariantCulture = CultureInfo.InvariantCulture;
05 NameValueCollection form = this.ControllerContext.HttpContext.Request.Form;
06 if (form != null)
07 {
08 foreach (string str in form.AllKeys)
09 {
10 string[] rawValue = form.GetValues(str);
11 string attemptedValue = form[str];
12 ValueProviderResult result = new ValueProviderResult(rawValue, attemptedValue, currentCulture);
13 this.AddToDictionaryIfNotPresent(str, result);
14 }
15 }
16 RouteValueDictionary values = this.ControllerContext.RouteData.Values;
17 if (values != null)
18 {
19 foreach (KeyValuePair<string, object> pair in values)
20 {
21 string key = pair.Key;
22 object obj2 = pair.Value;
23 string str4 = Convert.ToString(obj2, invariantCulture);
24 ValueProviderResult result2 = new ValueProviderResult(obj2, str4, invariantCulture);
25 this.AddToDictionaryIfNotPresent(key, result2);
26 }
27 }
28 NameValueCollection queryString = this.ControllerContext.HttpContext.Request.QueryString;
29 if (queryString != null)
30 {
31 foreach (string str5 in queryString.AllKeys)
32 {
33 string[] strArray4 = queryString.GetValues(str5);
34 string str6 = queryString[str5];
35 ValueProviderResult result3 = new ValueProviderResult(strArray4, str6, invariantCulture);
36 this.AddToDictionaryIfNotPresent(str5, result3);
37 }
38 }
39 }

从代码中我们可以获知,Action 参数的数据首先会从当前请求的form表单中取值,之后是route解析过的route values,最后是从QueryString中取得所前面没有重复出现过的值。重复出现的以最先取的值为优先。在某些情况下,我们可能会因为这个细节而 花费大量的时间在调试为什么我们Action中的参数值不正确。

阿不 http://hjf1223.cnblogs.com
赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏