用python验证蒙提霍尔题材

早期见到那些题目是初中的时候买了一本关于数学谜题的书里头概率论的一张的课后开展就是说到三门问题,当时看作一个恢弘阅读看了弹指间,里面说到了一个社会风气智慧最高的才女秒杀了美利坚合众国一大群的数学高材生的完美故事(相比较夸张),当时对这些题目也是似懂非懂。

事例引入

怎么样是蒙提霍尔题材?

图片 1

蒙提霍尔

蒙提霍尔问题,亦称作蒙特霍问题或三门问题(英文:Monty 哈尔l
problem),是一个溯源博弈论的数学游戏题材,大致出自美利哥的电视机娱乐节目Let’s
Make a Deal。问题的名字来自该节目标主席蒙提·霍尔(Monty 哈尔(Hal)l)。

最初的表达是:

参赛者会映入眼帘三扇关闭了的门,其中一扇的前边有一辆汽车,选中前面有车的那扇门就可以得到该汽车,而其余两扇门后边则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的中间一扇,透露里面一只山羊。主持人其后会问参赛者要不要换另一扇依然关上的门。
问题是:换另一扇门会否扩张参赛者赢得汽车的机会率?

其一古老的题目假使指出就挑起了凌厉的争持,有人觉得换与不换最后取得车的概率都是1/2,有人认为换门之后拿到车的几率更大,应该选拔换门之后得到车的票房价值为2/3在创作这篇作品的时候在果壳上还有人在为此争吵,知乎上也有广大有关这地点的探究,其实那么些争议很多意况下都是因这个问题的混淆表述所引起的,关键点在于召集人对于门后的气象是否精晓

  1. 假设主席事先知道哪些门里有山羊并且他特地采纳了有山羊的门打开了,那么参赛者应该换另一扇门,这足以将他胜利的票房价值从1/3升到2/3
  2. 借使主席事先不知道哪些门里有山羊或者他只是随便的挑三拣四了一个门,但事实发现里面恰好是山羊。这时候参赛者没有换门的必要,胜利概率总是1/2

为了持续的议论,这里运用维基百科上对于这么些题目标不马虎的定义

严苛的表明如下:

  • 参赛者在三扇门中采用一扇。他并不知道内里有什么样。
  • 主席知道每扇门后边有什么。
  • 召集人必须拉开剩下的中间一扇门,并且必须提供换门的机遇。
  • 主席永远都会挑一扇有山羊的门。
    • 假定参赛者挑了一扇有山羊的门,主持人必须挑另一扇有山羊的门。
    • 一旦参赛者挑了一扇有汽车的门,主持人随机在另外两扇门中挑一扇有山羊的门。
  • 参赛者会被问是不是保持他的原本采取,仍然转而挑选剩下的那一道门。

这就是说这些题材这可以很好的精晓了,引用维基的一幅图片解析:

图片 2

蒙提霍尔解答

有二种可能的动静,全体都有非常的可能(1/3):

  • 参赛者挑汽车,主持人挑多头羊的另外一头。转换将失利。
  • 参赛者挑A羊,主持人挑B羊。转换将取得汽车。
  • 参赛者挑B羊,主持人挑A羊。转换将获取汽车。

据此玩家采取换门之后赢球的票房价值应为2/3

 先看看如下例子,你能一心理解啊?

证明?

图片 3

蒙提霍尔解答

定义:

  • 事件A为一起来玩家接纳的一扇门
  • 事件H为尾声门后的结果

  • 一经是选项不换门的政策

因为拔取的是不互换的政策,所有只有一起来选中的是汽车,最终才能入选汽车。

  • 采取交换门的策略

因为拔取的是换成的策略,所有唯有一发端选中的是羊,最终才能当选汽车。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 using System.Web.Routing;
 7 
 8 namespace MVCDemo
 9 {
10     public class RouteConfig
11     {
12         public static void RegisterRoutes(RouteCollection routes)
13         {
14             routes.MapMvcAttributeRoutes();//特性路由
15 
16             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//忽略资源文件
17 
18             routes.MapRoute(
19                 name: "Default",//路由名,唯一
20                 url: "{controller}/{action}/{id}",//路由URL
21                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },//路由URL默认值
22                 namespaces: new[] { "MVCDemo.Controllers" },//命名空间避免二义性
23                 constraints: new { id = @"^\d*$" }//约束
24 
25                 );
26         }
27     }
28 }

程序验证

举办是考查真理的唯一标准,在流言终结者看到他们人工重复这多少个实验区验证,发现这么很浪费时间。何通过总计机去去模拟这一段过程吧?
下边接纳python程序来模拟这一段过程:

from __future__ import division
import logging
from matplotlib import pyplot as plt
import numpy as np
import random


class MontyHall(object):
    """docstring for MontyHall"""

    def __init__(self, num=3):
        """
        创建一个door列表
        0 代表关门
        1 表示后面有车
        -1 代表门被打开
        """
        super(MontyHall, self).__init__()
        self.doors = [0] * num
        self.doors[0] = 1
        self.choice = -1
        self.exclude_car = False
        self.shuffle()

    def shuffle(self):
        """  
        开始新游戏
        重新分配门后的东西
        """
        if self.exclude_car == True:
            self.doors[0] = 1
            self.exclude_car = False
        for i in xrange(len(self.doors)):
            if self.doors[i] == -1:
                self.doors[i] = 0
        random.shuffle(self.doors)

    def make_choice(self):
        """
        player随机选择一扇门
        """
        self.choice = random.randint(0, len(self.doors) - 1)
        logging.info("choice: %d" % self.choice)
        logging.info("original: %s" % self.doors)

    def exclude_doors(self):
        """
        主持人知道门后的情况排除门
        直到剩余两扇门
        """
        to_be_excluded = []
        for i in xrange(len(self.doors)):
            if self.doors[i] == 0 and self.choice != i:
                to_be_excluded.append(i)  
        random.shuffle(to_be_excluded)
        for i in xrange(len(self.doors) - 2):
            self.doors[to_be_excluded[i]] = -1
        logging.info("final: %s" % self.doors)

    def random_exclude_doors(self):
        """
        主持人并不知道门后面的情况随机的开门
        直到剩余两扇门
        """
        to_be_excluded = []
        for i in xrange(len(self.doors)):
            if self.doors[i] != -1 and i != self.choice:
                to_be_excluded.append(i)  
        random.shuffle(to_be_excluded)
        for i in xrange(len(self.doors) - 2):
            if self.doors[to_be_excluded[i]] == 1:
                self.exclude_car = True
            self.doors[to_be_excluded[i]] = -1
        logging.info("final: %s" % self.doors)

    def change_choice(self):
        """
        player改变选择
        """
        to_change = []
        for i in xrange(len(self.doors)):
            if self.doors[i] != -1 and i != self.choice:
                to_change.append(i)
        self.choice = random.choice(to_change)
        logging.info("choice changed: %d" % self.choice)

    def random_choice(self):
        """
        player 第二次随机选择门
        """
        to_select = []
        for i in xrange(len(self.doors)):
            if self.doors[i] != -1:
                to_select.append(i)
        self.choice = random.choice(to_select)
        logging.info("random choice : %d" % self.choice)


    def show_answer(self):
        """
        展示门后的情况
        """
        logging.info(self.doors)

    def check_result(self):
        """
        验证结果
        """
        got_it = False
        if self.doors[self.choice] == 1:
            got_it = True
        return got_it

注:该例子没有进入区域

如法炮制1000轮,每一轮重复试验1000次

  • 不改变选拔:

def unchange_choice_test(n):
    """
    不改变初始的选择
    """
    result = {}
    game = MontyHall()
    for i in xrange(n):
        game.shuffle()
        game.make_choice()
        game.exclude_doors()
        if game.check_result():
            result["yes"] = result.get("yes", 0) + 1
        else:
            result["no"] = result.get("no", 0) + 1
    for key in result:
        print "%s: %d" % (key, result[key])
    return result["yes"] / n

if __name__ == '__main__':
    logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.WARNING)
    results = []
    test_num = 1000
    round_num = 1000
    for x in xrange(0,round_num):
        results.append(change_random_test(test_num) )

    y_mean = np.mean(results)
    y_std = np.std(results)
    x = range(0,round_num)
    y = results
    plt.figure(figsize=(8,4))

    plt.xlabel("round")
    plt.ylabel("frequency")
    plt.title("The frequency of the success")
    tx = round_num / 2
    ty = y_mean
    label_var = "$\sigma \left( X \\right)=$%f" % y_std
    label_mean = "$ X =$%f" % y_mean
    p1_label = "%s and %s" % (label_var,label_mean)
    p1 = plt.plot(x,y,"-",label=p1_label,linewidth=2)
    plt.legend(loc='upper left')


    pl2 = plt.figure(2)
    plt.figure(2)
    plt.hist(results,40,normed=1,alpha=0.8)
    plt.show()

结果:

图片 4

这里输入图片的讲述

概率分布:

图片 5

此间输入图片的讲述

中标的几率均值在 1/3 附近

  • 更改接纳:

def change_choice_test(n):
    """
    交换选择的门
    """
    result = {}
    game = MontyHall()
    for i in xrange(n):
        game.shuffle()
        game.make_choice()
        game.exclude_doors()
        game.change_choice()
        if game.check_result():
            result["yes"] = result.get("yes", 0) + 1
        else:
            result["no"] = result.get("no", 0) + 1
    for key in result:
        print "%s: %d" % (key, result[key])
    return result["yes"] / n

一如既往的艺术绘图拿到结果:

图片 6

此处输入图片的叙述

概率分布:

图片 7

此地输入图片的叙述

事业有成的票房价值均值在 2/3 附近

因而地点的分析与模拟可知最佳的政策当然就是换门。

1 URI、URL与URN

越是历历在目的探究

  • 一经门的多寡不断是3个,假如是50扇门呢?

图片 8

此地输入图片的讲述

这种情状下,主持人打开48扇都是羊的门后,再给您选取,很四个人这么些时候应该就不会固守这1/2,而会采纳换门
把门的数量增大到100,1000,这种场地会越来越扎眼。
要么经过一段程序模拟表明:

def change_choice_test_large(n,m):
    """
    交换选择的门
    """
    result = {}
    game = MontyHall(m)
    for i in xrange(n):
        game.shuffle()
        game.make_choice()
        game.exclude_doors()
        game.change_choice()
        if game.check_result():
            result["yes"] = result.get("yes", 0) + 1
        else:
            result["no"] = result.get("no", 0) + 1
    for key in result:
        print "%s: %d" % (key, result[key])
    return result["yes"] / n


if __name__ == '__main__':
    logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.WARNING)
    results = []
    test_num = 1000
    round_num = 1000
    for x in xrange(0,round_num):
        results.append(change_choice_test_large(test_num,50) )

结果:

图片 9

图片 10

这时就要选拔交换门

  • 碰着这种意况我很迷惑,我说了算抛硬币决定,这些时候成功的几率?

这是第3种政策,成功的票房价值和硬币有关,也就是1/2,这种意况就是从剩下的门中随机挑选一扇,这一个政策从下边分析来看不是最好的,然而比不更改的方针要好。
次第的效仿结果:

图片 11

此地输入图片的讲述

图片 12

此间输入图片的描述

  • 譬如说门意外打开的情形吗,也就是下面描述的第两种意况(主持在不知门后的情状下打开门呢)?

这种气象下实际就是一个口径概率,事件A是玩家最后开到的是车,事件B是主持人打开的门是羊。

因为唯有主席开到是羊的情景下,玩家才有可能开到车所以

设玩家首先次选拔的门为事件C

  • 不交流策略下的规格概率是:

QQ截图20150510140602.png

  • 换成策略下的尺度概率是:

故此在主持人不了解门后的情状下打开一扇,然后发现门后是羊的事态下,换门与不换门最后的概率都是1/2
还可以够透过程序举行效仿:

def unknown_doors_choice_test(n):
    """
    主持人并不知道门后面的情况随机的开门
    交换选择的门
    """
    result = {}
    game = MontyHall()
    continue_count = 0
    for i in xrange(n):
        game.shuffle()
        game.make_choice()
        game.random_exclude_doors()
        game.change_choice()
        if game.exclude_car == False:
            continue_count += 1
        if game.check_result():
            result["yes"] = result.get("yes", 0) + 1
        else:
            result["no"] = result.get("no", 0) + 1
    #for key in result:
    #    print "%s: %d" % (key, result[key])
    logging.info("continue_count: %d" % continue_count)
    if continue_count == 0:
        return 0.0
    return result["yes"] / continue_count   

图片 13

此地输入图片的叙述

图片 14

此处输入图片的叙说

在这种情况下交流门也从没提拔成功的几率


 1.1 URI、URL和URN定义 

总结

前几天写的这篇东西也算是领悟自我刻钟候的一个缺憾,人的直觉有时候是很不可靠,要摆脱个人局限的体味才能拥抱更大的社会风气。
怎么着?看完这一个分析,你还觉得不称心那么您还可以够从下边的参阅中寻觅更好的解析,本文撰写过程有一对的图形引用自一下的参考,假使你还有疑问欢迎您关系自己越来越的商讨。

     URI(Uniform Resource
Identifier)代表统一资源标识符,标识资源的字符串;

练习

下边是三门题材的五个翻版,引用自三门问题及有关

     URL (Uniform Resource
Locator)代表联独资源定位符,互联网上标准资源的地点;

女孩的票房价值

  • 你结交一位新情人,问他是否有男女。她说有,有多少个。你问,有女孩吧?她说有。那么,四个都是女孩的几率是稍稍?

答:三分之一。因为生六个孩子的可能有四种等可能:BB、GG、BG、GB(即男男、女女、男女、女男)。
因为我们已知至少有一个姑娘,所以BB是不可以的。由此GG是可能出现的多个等可能的结果之一,所以四个男女都是外孙女的概率为三分之一。这对应了三门问题的率先种状态。

  • 您结交一位新情人,问她是不是有男女。她说有,有六个。你问,有女孩吧?她说有。第二天,你看见他带了一个小女孩。你问他,那是你孙女吧?她说,是。她的四个男女都是女孩的票房价值是稍微?

这么些概率和生女孩的几率一样,二分之一。这如同非凡想拿到,因为大家所拥有的音信看起来并不比第一种境况时多,但概率却不比。但是此地的问题莫过于是,那一个你没>见过的儿女是女孩的概率是有些?那些概率和生女孩的几率一样,二分之一。
这对应了三门问题的第两种状况。当然这里也有语言问题,必须假定这位岳母不是一定带出一个小女孩来给您看的。也就是说你只是刚刚发现了它是位小女孩。这取决是判定选择或q
随机选拔。假设是被你刚好撞见这是属于擅自选择。这就对应了三门题材的第两种状态。那实际上是增多了消息的。否则一旦他主动带一个小女孩过来给你,则属于判断选取。
您收获的答案依赖于所讲的故事;它依靠于你是哪些得知至少一个子女是女孩的。

     URN(Uniform Resources
Name)代表联合营源名称,互联网上资源的称呼;

三犯人问题

  • Adam、比尔(比尔(Bill))和查理被关在一个铁栏杆里,只有监狱看守知道何人会被判死刑,其余两位将会释放。有1/3的概率会被处死刑的亚当(Adam),给她小姑写了一封信,想要获释的比尔或查理扶助代寄。当Adam问看守他应该把她的信交给比尔仍然查理时,那位怀有同情心的防御很难堪。他觉得只要她把即将获释的人的名字告诉亚当(Adam),那么Adam就会有1/2的几率被判死刑,因为剩下的人和亚当(Adam)这两个人中肯定有一个人被处死。假诺她背着这音讯,亚当(Adam)被处决的几率是1/3。既然亚当(Adam)知道其他两人中必有一人会放出,那么亚当(Adam)自己被处决的概率怎么可能会因为看守告诉她此外六个人中被获释者的真名后而更改啊?

是的的答案是:看守不用当心,因为尽管把自由人的真名告诉Adam,亚当(Adam)被处决的概率仍旧是1/3,没有变动。但是,剩下的这位没被点名的人就有2/3的票房价值被处死(被处决的可能提升了)。假诺这么些题目换一种说法,就是防守无意间表露了查理(Charles)不会死。那么几率就会暴发改变。
其一实在和三门问题是一致的。你能够把狱卒当成主持人,被处决当成是大奖,那么那多少个是对应于三门问题的第一种情景,就是主持人知道门前边的意况。狱卒说出谁会被放出,相当于主席打开一扇门。不过因为三囚徒问题无法采用,也就一定于三门问题中的不换门的政策。最后的概率如故1/3是尚未爆发变更的。
为了制止生出歧义,规定一下:
1.如果(亚当(Adam),查理)被释放,那么狱卒会告知Adam:”查尔斯(Charles)被假释”。
2.万一(Adam,比尔(比尔))被放走,那么狱卒会告知Adam:”比尔(比尔)被放飞”
3.倘使(查尔斯(Charles),比尔(比尔(Bill)))被假释,那么狱卒会以1/2的票房价值告诉Adam:”查理(Charles)被保释”或者”比尔(Bill)被放出”
意思就很扎眼了,在看守说出比尔(Bill)被释放的标准化下,Adam被假释的几率是?用口径概率算一下。
概念事件:

A :狱卒说出”比尔(比尔(Bill))被放飞”
B :代表Adam被释放。

图片 15

这何时才是1/2的票房价值呢?
规则3更改为:假诺(查理,比尔(比尔))被放飞,那么狱卒会报告亚当(Adam)”比尔(比尔(Bill))被释放”
本条时候统计就是:

图片 16

这倘使规则3改为:如若(查理(Charles),比尔(Bill))被放走,那么狱卒会告知Adam”查理(Charles)被放飞”
这一个时候:亚当(Adam)被假释的几率就会变成1
题材在于规则2和规则3下说”比尔被放走”不是等概率爆发的。

 1.2 URI、URL和URN三者之间的涉嫌图

类似的问题还有

  • 抛两枚硬币其中有一枚硬币是正面,问两枚硬币都是端正的票房价值是?
  • 抛两枚硬币其中第一枚硬币是尊重,问两枚硬币都是尊重的票房价值是?

the end.


图片 17

参考:

  1. 蒙提霍尔问题 –
    维基百科,自由的百科全书

  2. 三扇门问题 |
    左岸读书

  3. 蒙提霍尔问题(又称三门题材、山羊汽车问题)的正解是什么样?

  4. 情趣编程:三门题材

  5. 三门问题及连锁

  1. 换依旧不换?争议没有停下过的三门问题

  2. 在「三门问题」中,参预者应该拔取「换」仍旧「不换」?主持人是否知晓门后情状对结论有何影响?

  3. THE MONTY HALL
    PROBLEM

  4. 流言终结者第九季

  5. 某个家庭中有 2
    个小孩子,已知其中一个是女孩,则另一个是男孩的几率是不怎么?-新浪

  6. 从贝叶斯定律的角度精通“蒙提霍尔问题”和“四个囚徒问题”

  7. 两个囚徒问题,求解?


改进日志:

  • 2015-05-20 增添三囚徒问题的解答
  • 2015-05-09 第一次作文

1.3 对URI、URL和URN三者之间解析

      本解析基于1.2
URI、URL和URN三者之间的涉嫌图。

     
(1)从命名角度,URI标识资源且唯一,URL标识资源地址
,URN标识资源名称;

     
(2)从数学关系:URI=URL+URN+URL∩URN;很容易看到,URL一定是URI,但URI不自然是URL,同理,URN一定是URI,但URI不肯定是URN;

1.4 URL应享有特色

     (1)  域名便于记念和拼写;

     (2)  简短;

     (3)  便于输入;

     (4)  可以反映出站点布局;

     (5)
 应该是“可破解的”,用户可以因而移除URL的尾声,进而到达更高层次的消息连串布局;

     (6)  持久、不可以改变

1.5  小结

     
 通常状态下,URI代表同意资源标识符(Uniform Resource
Identifier)。URI是标识了一个资源的字符串。从技术角度看,所有URL都是URI。W3C认为“URL是一个业余的定义,但它特别有效:URL是URI的一种档次,它通过代表我的首要走访机制来标识资源”,换句话说,URI是某种资源的标识符,而URL则为得到该资源提供了现实的信息。

     
 注释:资源是一个抽象概念,既可以指一个文件,也可以指方法调用的结果或服务器上的部分其他内容。

2 路由概述(传统路由)

2.1  WebForm URL与Route URL

   
 (1)WebForm中,对URL的不胫而走请求平日映射到磁盘上的物理文件,如.aspx文件。例如对http://server/application/Product.aspx?id=4的请求映射到名为Products.aspx文件,该文件包含代码和标记用于呈现对浏览器的响应,一般请求示过程抽象如下:

   
 图片 18

     (2)ASP.NET
MVC中,平时地,URL映射并非映射到具体磁盘上的大体文件,那是依据ASP.NET路由特性,重要有多少个过程,即URL映射和URL生成(接下去讲解)。在ASP.NET路由中,您可以定义URL形式,该格局涵盖在处理URL请求时接纳的值的占位符。在运行时,运用程序名称前面的URL部分依据你所定义的URL情势分析为离散值。例如,在伏乞http://server/application/Products/show/beverages时,路由分析器可以将值Products、show和beverages传递给请求的处理程序。相反,在一个不由URL路由管理的请求中,/Products/show/beverages片段将被解释为运用程序中的一个文件的路径。
  

2.2  ASP.NET 路由与 URL 重写

        ASP.NET 路由不同于其他 URL
重写方案。URL 重写通过在将呼吁发送到网页在此以前实际更改 URL
来拍卖传入请求。例如,一个用到 URL 重写的应用程序可能会将 URL 从 /Products/Widgets/ 更改为 /Products.aspx?id=4。此外,URL 重写常常没有对应的 API
来创设基于格局的 URL。在 URL 重写中,假使改变了 URL
情势,则必须手动更新包含原始 URL 的享有超链接。由于
ASP.NET 路由得以从 URL 提取值,所以拍卖传入请求时不更改
URL。假诺必须创制一个 URL,则将参数值传递到为您生成 URL
的主意中。若要更改 URL
情势,请在某地点变动该形式,您在应用程序中创设的依据该模式的有着链接将自行使用新情势。

2.3  路由定义

        A route is a URL pattern that is mapped to a handler.
The handler can be a physical file, such as an .aspx file in a Web Forms
application. A handler can also be a class that processes the request,
such as a controller in an MVC application. To define a route, you
create an instance of the Route class by specifying the URL pattern, the
handler, and optionally a name for the route.

     
 译文:路由是一种被映射到某个处理程序的URL模式。处理程序可能是一个物理文件,如在WebForms运用程序中的aspx文件。处理程序也恐怕是一个甩卖请求的类,如MVC应用程序中的控制器。要定义路由,您可以通过点名URL格局、处理程序和途径的称号来创建路由类的实例。

      You add the route to the
application by adding the Route object to the static Routes property of
the RouteTable class. The Routes property is a RouteCollection object
that stores all the routes for the application.You typically do not have
to write code to add routes in an MVC application. Visual Studio project
templates for MVC include preconfigured URL routes. These are defined in
the MvcApplication class, which is defined in the
Global.asax file.

     
译文:你可以因此将路由对象添加到RouteTable类的静态路由属性中的格局将路由添加到应用程序中。路由属性是一个为应用程序存储所有路由的路由对象。在MVC应用程序中,您平日不需要编制代码来添加路由。VS项目模板为MVC包含了优先布置的URL路由。这一个都是在MvcApplication类中定义的,被定义在Global.asac
文件中。

2.4 URL Patterns(URL模式)

A URL pattern can contain literal values
and variable placeholders (referred to as URL
parameters). The literals and placeholders are located in segments of the URL which are delimited by the slash
(/) character.

译文:URL格局也许包含文字值和变量占位符(称为URL参数)。文字和占位符位于URL的一对中,由斜杠(/)字符分隔。

When a request is made, the URL is parsed
into segments and placeholders, and the variable values are provided to
the request handler. This process is similar to the way the data in
query strings is parsed and passed to the request handler. In both cases
variable information is included in the URL and passed to the handler in
the form of key-value pairs. For query strings both the keys and the
values are in the URL. For routes, the keys are the placeholder names
defined in the URL pattern, and only the values are in the URL.

译文:当发出请求时,URL被分析为一些和占位符,且变量值被提供给请求处理程序。这一个过程看似于查询字符串中的数据被分析并传递给请求处理程序的模式。在这两种意况下,变量新闻都带有在URL中,并以键值对的花样传递给处理程序。对于查询字符串,键和值都在URL中。对于路由,键是URL情势中定义的占位符名称,在URL中只有是值。

In a URL pattern, you define placeholders
by enclosing them in braces ( { and } ). You can define more than one
placeholder in a segment, but they must be separated by a literal value.
For example, {language}-{country}/{action} is a valid
route pattern. However, {language}{country}/{action} is not a valid pattern,
because there is no literal value or delimiter between the placeholders.
Therefore, routing cannot determine where to separate the value for
the language placeholder from the value for the country placeholder.

译文:在URL格局中,通过将它们封装在括号(以及)中来定义占位符。您可以在一个段中定义六个占位符,不过必须用文字值分隔它们。例如,语言-国家/行动是一种有效的门道格局。然则,语言国家/action不是一个实用的情势,因为占位符之间平昔不文字值或分隔符。由此,路由不可能说了算将语言占位符的值与国家占位符的值分隔开。

The following table shows valid route
patterns and examples of URL requests that match the patterns.

下表突显了有效的路由形式和与格局匹配的URL请求示例。

图片 19

 Typical URL Patterns in MVC
Applications

译文:MVC运用程序中的经典形式

 URL patterns for routes in MVC
applications typically include {controller} and {action} placeholders.

译文:在MVC运用程序中,路由URL情势平时包含控制器和动作占位符。

When a request is received, it is routed
to the UrlRoutingModule object and then to the MvcHandler HTTP handler.
The MvcHandler HTTP handler determines which controller to invoke by
adding the suffix “Controller” to the controller value in the URL to
determine the type name of the controller that will handle the request.
The action value in the URL determines which action method to
call.

译文:当接过到一个呼吁时,它被路由到UrlRoutingModule对象,然后发送到MvcHandler
HTTP处理程序。MvcHandler
HTTP处理程序通过向URL中的控制器值添加后缀“控制器”来规定要调用哪个控制器,以确定控制器的花色名称,该控制器将拍卖请求。URL中的操作值决定调用哪个操作方法。

For example, a URL that includes the URL
path /Products is mapped to a controller named ProductsController. The value in the action parameter is the name of the action method that
is called. A URL that includes the URL path /Products/show would result in a call to the Showmethod of the ProductsController class.

译文:例如,一个蕴含URL路径  /产品
的URL映射到一个名为ProductsController的控制器。action参数中的值是调用的操作方法的名号。一个分包URL路径
  /产品/show
 的URL会造成对ProductsController类的Showmethod的调用。

The following table shows the default URL
patterns, and it shows examples of URL requests that are handled by the
default routes.

译文:下表扬显了默认的URL情势,它彰显了由默认路由拍卖的URL请求的演示。

 图片 20

The route with the pattern {resource}.axd/{*pathInfo} is included to prevent requests
for the Web resource files such as WebResource.axd or ScriptResource.axd
from being passed to a controller.

For IIS 7.0, no file-name extension is
needed. For IIS 6.0, you must add the .mvc file-name extension to the
URL pattern, as in the following example:

译文:带有格局资源的路由axd/pathInfo,被用来避免Web资源文件的伸手,例如WebResource,axd或ScriptResource传递到控制器。对于IIS
7.0,不需要此外文件名称扩大。对于IIS
6.0,您必须添加.mvc文件增加名到URL格局中,如下边的事例:

 图片 21

 如在VS2013利用MVC模板创制项目时,自动生成类RouteConfig.

图片 22

2.5 Adding Routes to a Web Forms
Application(添加路由到WebForm运用程序)

In a Web Forms application, you create
routes by using the MapPageRoute(String, String, String) method of the
RouteCollection class. The MapPageRoute method creates a Route object
and adds it to the RouteCollection object. You specify properties for
the Route object in parameters that you pass to the MapPageRoute
method.

译文:在Web
Forms应用程序中,您可以选取路由精选类的MapPageRoute(字符串、字符串、字符串)方法创造路由。MapPageRoute方法成立一个路由对象并将其添加到RouteCollection对象。您可以在传递给MapPageRoute方法的参数中指定路由对象的性质。

Typically, you add routes in a method
that is called from the handler for the Application_Start event in the
Global.asax file. This approach makes sure that the routes are available
when the application starts. It also enables you to call the method
directly when you unit-test the application. If you want to call a
method directly when you unit-test the application, the method that
registers the routes must be static (Shared in Visual Basic) and must
have a RouteCollection parameter.

译文:通常地,在全局Global.asax文件中,您可以在一个叫做Application_Start
方法里添加路由。该方法确保当应用程序启动时,路由是可以使用的。它还使你可以在对应用程序举办单元测试时一向调用该办法。假使你想在对应用程序进行单元测试时间接调用方法,那么注册路由的情势必须是静态的(在Visual
Basic中是共享的),并且必须怀有一个路由参数。

The following example shows code from a
Global.asax file that adds a Route object that defines two URL
parameters named action and categoryName. URLs that have the specified
pattern are directed to the physical page named Categories.aspx.

译文:下面的示范展现了来自.Globalasax文件的代码,该代码添加了一个路由对象,该对象定义了多少个名为action和连串称号的URL参数。具有指定格局的url被定向到名为分类.aspx的情理页面。

protected void Application_Start(object sender, EventArgs e)
{
    RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapPageRoute("",
        "Category/{action}/{categoryName}",
        "~/categoriespage.aspx");
}

2.6 Adding Routes to an MVC
Application

 If you adopt the MVC convention of
implementing controllers by creating classes that derive from the
ControllerBase class and giving them names that end with “Controller”,
you do not need to manually add routes in an MVC application. The
preconfigured routes will invoke the action methods that you implement
in the controller classes.

译文:假若你通过创办从控制器基类派生的类来兑现控制器的MVC约定,并给它们以“控制器”结尾的名称,那么你就不需要在MVC应用程序中手动添加路由了。预配置的路由将调用您在控制器类中落实的操作方法。

If you want to add custom routes in an
MVC application, you use the MapRoute(RouteCollection, String, String)
method instead of the MapPageRoute(String, String, String)
method.
译文:假使你想在MVC应用程序中添加自定义路由,您可以应用MapRoute(RouteCollection、String、String)方法,而不是MapPageRoute(字符串、字符串、字符串)方法。

The following example shows the code that
creates default MVC routes in the Global.asax file, as defined in the
Visual Studio project template for MVC applications.

 译文:下面的例证体现了在大局中开创默认MVC路由的代码。asax文件,正如在Visual
Studio项目模板中定义的MVC应用程序。

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",                                              // Route name 
            "{controller}/{action}/{id}",                           // URL with parameters 
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

    }

    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }
}

2.7 Setting Default Values for URL
Parameters(为URL参数设置默认值)

When you define a route, you can assign a
default value for a parameter. The default value is used if a value for
that parameter is not included in the URL. You set default values for a
route by assigning a dictionary object to the Defaults property of the
Route class. The following example shows how to add a route that has
default values, by using the MapPageRoute(String, String, String,
Boolean, RouteValueDictionary) method.

译文:当您定义一个路由时,您能够为一个参数指定一个默认值。假诺该参数的值没有包含在URL中,则应用默认值。通过将dictionary对象分配给route类的默认属性,可以为路由设置默认值。下边的例证展现了如何通过利用MapPageRoute(字符串、字符串、字符串、布尔值、RouteValueDictionary)方法添加具有默认值的路由。

void Application_Start(object sender, EventArgs e) 
{
    RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapPageRoute("",
        "Category/{action}/{categoryName}",
        "~/categoriespage.aspx",
        true,
        new RouteValueDictionary 
            {{"categoryName", "food"}, {"action", "show"}});
}

When ASP.NET routing handles a URL
request, the route definition shown in the example (with default values
of food for categoryName and showfor action) produces the results that
are listed in the following table.

图片 23

For MVC applications, overloads of the
RouteCollectionExtensions.MapRoute method, such as
MapRoute(RouteCollection, String, String, Object, Object), enable you to
specify defaults.

2.8 Handling a Variable Number of Segments
in a URL Pattern(在URL形式中拍卖可变多少的段)

Sometimes you have to handle URL requests
that contain a variable number of URL segments. When you define a route,
you can specify that if a URL has more segments than there are in the
pattern, the extra segments are considered to be part of the last
segment. To handle additional segments in this manner you mark the last
parameter with an asterisk (*). This is referred to
as a catch-all parameter. A route with a
catch-all parameter will also match URLs that do not contain any values
for the last parameter. The following example shows a route pattern that
matches an unknown number of segments.

译文:有时你必须处理包含一个可变多少的URL段的URL请求,其中。当你定义一个路由时,您可以指定,假设一个URL的一部分比格局中有更多的段,那么额外的段被认为是最后一片段的一片段。要以这种方法处理额外的段,您可以用星号(*)标记最终一个参数。这被叫做一个含糊的参数。一个带有所有参数的路由也将分外不含有最终一个参数的任何值的url。下面的演示展示了一个郎才女貌未知数量的段的路由格局。

/ query / { queryname } { * queryvalues
}

When ASP.NET routing handles a URL
request, the route definition shown in the example produces the results
that are listed in the following table.

译文:当ASP.NET路由拍卖一个URL请求时,示例中所示的路由定义爆发了下表中列出的结果。

图片 24

2.9  Adding Constraints to
Routes(为路由添加封锁)

In addition to matching a URL request to
a route definition by the number of parameters in the URL, you can
specify that values in the parameters meet certain constraints. If a URL
contains values that are outside the constraints for a route, that route
is not used to handle the request. You add constraints to make sure that
the URL parameters contain values that will work in your
application.

译文:除了通过URL中参数的数目来匹配URL请求外,还足以指定参数中的值满意一定的封锁规范。假诺一个URL包含的值超出了路由的自律,那么该路由就不会被用来拍卖请求。您添加了有的羁绊,以确保URL参数包含在您的应用程序中劳作的值。
Constraints are defined by using regular
expressions or by using objects that implement the IRouteConstraint
interface. When you add the route definition to the Routes collection,
you add constraints by creating a RouteValueDictionary object that
contains the verification test. The key in the dictionary identifies the
parameter that the constraint applies to. The value in the dictionary
can be either a string that represents a regular expression or an object
that implements the IRouteConstraint interface.

译文:约束是通过运用正则表达式或使用实现IRouteConstraint接口的目的来定义的。当将路由定义添加到路由集合时,通过成立一个包含验证测试的RouteValueDictionary对象来增长约束。字典中的键标识约束应用到的参数。字典中的值可以是代表正则表明式的字符串,也足以是落实IRouteConstraint接口的对象。
If you provide a string, routing treats
the string as a regular expression and checks whether the parameter
value is valid by calling the IsMatch method of the Regex class. The
regular expression is always treated as case-insensitive. For more
information, see .NET Framework Regular Expressions.

译文:假若你提供一个字符串,那么路由将字符串作为一个正则表明式来处理,并由此调用Regex类的IsMatch方法检查参数值是否管用。正则表达式总是被视为不区分轻重缓急写的。要询问更多音讯,请参阅。净框架正则表明式。
If you provide an IRouteConstraint
object, ASP.NET routing checks whether the parameter value is valid by
calling the Match method of the IRouteConstraint object. The Match
method returns a Boolean value that indicates whether the parameter
value is valid.

译文:倘使您提供一个IRouteConstraint对象,ASP.NET
路由通过调用IRouteConstraint对象的匹配方法,
以此来检查参数值是否行得通。Match方法再次回到一个布尔值,该值表示参数值是否管用。
The following example shows how to use
the MapPageRoute method to create a route that has constraints that
limit what values can be included in the locale and year parameters. (In
an MVC application, you would use the MapRoute method.)

译文:下边的示范展现了如何运用MapPageRoute方法创制一条路径,该路由限制了地域和年参数中可以涵盖的值。(在MVC应用程序中,您将接纳map路由艺术。)

 

 1 public static void RegisterRoutes(RouteCollection routes)
 2 {
 3     routes.MapPageRoute("",
 4         "Category/{action}/{categoryName}",
 5         "~/categoriespage.aspx",
 6         true,
 7         new RouteValueDictionary 
 8             {{"categoryName", "food"}, {"action", "show"}},
 9         new RouteValueDictionary 
10             {{"locale", "[a-z]{2}-[a-z]{2}"},{"year", @"\d{4}"}}
11        );
12 }

When routing handles a URL request, the
route definition shown in the previous example produces the results that
are listed in the following table.

图片 25

 2.10 Scenarios When Routing Is Not
Applied(不应用路由时的景观)

Under
some circumstances, ASP.NET routing does not handle a request even when
is enabled for the Web site. This section describes some scenarios in
which routing does not handle the request.

译文:在少数情状下,即便在Web站点启用时,ASP.NET
路由也不处理请求。本有的讲述了有的情景,其中路由不处理请求。

A Physical File is Found that Matches
the URL Pattern(找到与URL格局匹配的物理文件)

By default, routing does not handle
requests that map to an existing physical file on the Web server. For
example, a request for
http://server/application/Products/Beverages/Coffee.aspx is not handled
by routing if a physical file exists at Products/Beverages/Coffee.aspx.
Routing does not handle the request even if it matches a defined
pattern, such as {controller}/{action}/{id}.

译文:默认情形下,路由不处理映射到Web服务器上幸存物理文件的伸手。例如,如若存在 Products/Beverages/Coffee.aspx.物理文件,请求http://server/application/Products/Beverages/Coffee.aspx
不被路由拍卖。即便它与已定义的格局相匹配,路由不处理请求,例如控制器/动作/id。
If you want routing to handle all
requests, even requests that point to files, you can override the
default behavior by setting the RouteExistingFiles property of the
RouteCollection object to true. When you set this value to true, all
requests that match a defined pattern are handled by routing.

译文:如若你想要路由拍卖所有请求,甚至指向文件的伸手,您可以因此设置RouteCollection对象的性质RouteExistingFiles为true, 
以此来覆盖默认值。当您将以此值设置为true时,匹配定义情势的具备请求都由路由拍卖。

Routing Is Explicitly Disabled for a
URL Pattern(为URL格局显式禁用路由)

You can
also specify that routing should not handle certain URL requests. You
prevent routing from handling certain requests by defining a route and
specifying that the StopRoutingHandler class should be used to handle
that pattern. When a request is handled by a StopRoutingHandler object,
the StopRoutingHandler object blocks any additional processing of the
request as a route. Instead, the request is processed as an ASP.NET
page, Web service, or other ASP.NET endpoint. You can use the
RouteCollection.Ignore method  

译文:您还足以指定路由不应有处理某些URL请求。通过定义一条路由,并指定StopRoutingHandler类应该用于拍卖该模式,从而制止了拍卖某些请求的路由。当一个StopRoutingHandler对象处理请求时,StopRoutingHandler对象会阻塞请求作为路由的其他附加处理。相反,请求是作为ASP.NET
页面来拍卖的,网络页面,Web服务,或任何ASP.NET端点。您可以应用 RouteCollection.Ignore方法。

1 public static void RegisterRoutes(RouteCollection routes)
2 {
3   routes.Ignore("{resource}.axd/{*pathInfo}");
4 }

2.11 How URLs Are Matched to
Routes(url怎么着与路由异常)

When routing handles URL requests, it
tries to match the URL of the request to a route. Matching a URL request
to a route depends on all the following conditions:

译文:当路由拍卖URL请求时,它尝试将呼吁的URL与路由相当。将URL请求匹配到路由取决于以下标准:

  • The route patterns that you have
    defined or the default route patterns, if any, that are included in
    your project type. 

  • 译文:您曾经定义的路由模式或默认的路由情势,假使有的话,它们包含在你的项目系列中。

  • The order in which you added them to
    the Routes collection.
  •  译文:您将它们增长到路由集合的逐条。

  • Any default values that you have
    provided for a route.

  • 译文:您为某个路由提供的其余默认值。
  • Any constraints that you have
    provided for a route.

  • 译文:您为路径所提供的别样自律。

  • Whether you have defined routing to
    handle requests that match a physical file.

  • 译文:是否定义了路由来处理与物理文件匹配的呼吁。

For example, suppose that you add routes
with the following patterns:

译文:例如,假诺您添加了以下形式:
   Route 1 is set to
{controller}/{action}/{id}

   译文:
路径1设置为{controller}/{action}/{id}
   Route 2 is set to
products/show/{id}

 
译文:路线2设置为 products/show/{id}
Route 2 will never handle a request
because Route 1 is evaluated first, and it will always match requests
that could also work for Route 2. A request for
http://server/application/products/show/bikes seems to match Route 2
more closely, but it is handled by Route 1 with the following
values:
controller is products.
action is show.
id is bikes.

译文:

路由2永远不会处理请求,因为路由1先是被匹配,它总是匹配可能在2号路径上工作的伸手。请求http://server/application/products/show/bikes似乎比赛路线2更紧密,但它是由路线1以下值:

控制器products.

行动是show.

id是bikes.

Default values are used if a parameter is
missing from the request. Therefore, they can cause a route to match a
request that you did not expect. For example, suppose that you add
routes with the following patterns:
Route 1: {report}/{year}/{month}, with
default values for year and month.
Route 2: {report}/{year}, with a default
value for year.
Route 2 will never handle a request.
Route 1 might be intended for a monthly report, and Route 2 might be
intended for an annual report. However, the default values in Route 1
mean that it will match any request that could also work for Route
2.

译文:

设若请求中缺失一个参数,则拔取默认值。由此,它们能够引致一条匹配您没有预料到的伸手的路由。例如,假如您添加了以下格局:

途径1:报告/年/月,年和月默认值。

路线2:报告/年,年默认值。

路由2永远不会处理请求。第1条可能是本着每月报告的,而路由2可能是针对性年度报告的。不过,路由1中的默认值意味着它将匹配任何可能用于路由2的请求。

You can avoid ambiguity in the patterns
by including constants, such as annual/{report}/{year} and
monthly/{report}/{year}/{month}.
If a URL does not match any Route object
that is defined in the RouteTable collection, ASP.NET routing does not
process the request. Instead, processing is passed to an ASP.NET page,
Web service, or other ASP.NET endpoint.

译文:您可以因而包含常量来避免情势中的歧义,例如
annual/{report}/{year} and monthly/{report}/{year}/{month}。

假定URL不般配在RouteTable集合中定义的另外路由对象,ASP.NET路由不处理请求。相反,处理被传送给一个ASP.NET
Page ,Web服务,或其他ASP.NET端点。

2.12 路由二义性

只在同一个化解方案中,存在六个以及上述同等控制器下的相同action,当URL请求时,会油可是生二义性。

二义性Demo目录结构

图片 26

RouteConfig.cs

图片 27图片 28

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 using System.Web.Routing;
 7 
 8 namespace MVCDemo
 9 {
10     public class RouteConfig
11     {
12         public static void RegisterRoutes(RouteCollection routes)
13         {
14             routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
15 
16             routes.MapRoute(
17                 name: "Default", 
18                 url: "{controller}/{action}/{id}", 
19                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
20                 
21            );
22         }
23     }
24 }
25                 

View
Code

/Controllers/RouteDemo

图片 29图片 30

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace MVCDemo.Controllers
 8 {
 9     public class RouteDemoController : Controller
10     {
11         //
12         // GET: /RouteDemo/
13         public ActionResult Index()
14         {
15             return View();
16         }
17     }
18 }

View
Code

/Controllers/NewFolder1/RouteDemo

图片 31图片 32

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace MVCDemo.Controllers.NewFolder1
 8 {
 9     public class RouteDemoController : Controller
10     {
11         //
12         // GET: /RouteDemo/
13         public ActionResult Index()
14         {
15             return Content("路由二义性测试");
16         }
17     }
18 }

View
Code

测试结果

图片 33

3 路由概述(特性路由)

 特性路由是在ASP.NET MVC
5中新增的,传统路由ASP.NET MVC 1中就有了。

 从内容上来看,特性路由的情节与历史观路由差不多,同样有路由URL、路由值、控制器路由、路由约束和路由默认值等。鉴于篇幅限制,在此处就概括的概述一下,不作详细解说,中期有时光如故有对象需要,再论述。

 定义:特性路由就是将路由URL定义在控制器上或控制器内的措施上,而不像传统路由将路由URL定义在RouteConfig.cs中。比较如下

图片 34

 

图片 35

3 路由生成URL

 
 路由五个首要职责:匹配传入的URL请求和布局与一定路由对应的URL,概括之匹配URL和结构URL。在生成URL时,生成URL的情趣应该率先与拔取用来生成URL的路由相匹配,这样路由就可以在拍卖传入或传播的URL时成为全部的双向系统。原则上,开发人士应该提供一组路由值,以便路由系统从中选中第一个可以匹配URL的路由。

 3.1 URL生成的高层系概述

 
路由的主干是一个分外简单的算法,该算法基于一个由RouteCollection类和RouteBase类组成的简要抽象对象。可以行使多种办法来生成URL,但这多少个形式皆以调用RouteCollection.GetVirtualPath的一个重载方法而终结。RouteCollection.GetVirtulPath方法公有五个重载版本,下面的代码体现它们的情势签名:

1  public  VirtualPathData GetVirtualPath(RequestContext requestContex,RouteValueDictionary values)
2 
3  public  VirtualPathData GetVirtualPath(RequestContext requestContex,string name,RouteValueDictionary values)

 第一个重载版本接受当前的RequestContext,以及由用户指定的路由值(字典)。

(1)路由集合通过RouteBase.GetVirtualPath方法遍历每个路由并走访:“可以转变给定参数的URL吗”,那一个进程看似于在路由与传播请求匹配时所使用的卓殊逻辑。

(2)假若一个路由可以答应下面的题材(即匹配),那么它就会回到一个饱含了URL的VirTualPathData实例以及任何匹配的音讯。否则,它就回来空值,路由体制移向列表中的下一个路由。

第二个重载接受两个参数,其中第二个参数是路由名称。在路由集合中路由名称是唯一的,也就是说,没有多少个例外的路由具有相同的名称。当指定了路由名称时,路由集合就不需要循环遍历每个路由,相反,它可以立刻找到指定名称的路由,并移向下边的步调(2)。假如找到的路由不可能匹配指定的参数,该措施就会回到空值,并且不再匹配其他路由。

  3.2  URL生成详解

 
(1)开发人员调用像Html.ActionLink或Url.Action之类的点子,这几个主意反过来再调用RouteCollection.GetVirtualPath方法,并向它传递一个RequestContext对象、一个包含值的字典以及用于选拔生成URL的路由名称(可选参数)。

 (2)路由体制查看要求的路由参数(即没有提供路由参数的默认值),并保证提供的路由值字典为每一个渴求的参数提供一个值,否则,URL生成程序就会立马截止,并重临空值。

 (3)一些路由可能带有没有对应路由参数的默认值。如路由可能为category键提供默认值“pastries”,不过cateory不是路由URL的一个参数,这种气象下,假使用户传入的路由值字典为category提供了一个值,那么该值必须匹配category的默认值。

 (4)然后路由系统利用路由约束。

(5)路由优秀成!现在得以经过翻看每一个路由参数,并尝试选取字典中的对应值填充相应参数,进而生成URL。

可以包括为如下流程图:

图片 36

 

4 路由绑定到操作

 在这一章节,紧要分析URL绑定到控制器操作的最底层细节,分析底层原理,了解ASP.NET请求管道。注意,最近路由不仅仅只是ASP.NET
MVC的一个表征了,它早已超越那多少个界定,如ASP.NET Dynamic
Data。路由既不包括MVC的里边知识,也不借助于于MVC。

 4.1 高层次请求的路由管道

  当ASP.NET
处理请求时,路由管道重要由以下几步组成:

 
 (1)UrlRoutingModule尝试使用在RouteTable中登记的路由匹配当前哀求。

 
 (2)假设RouteTable中有一个路由中标匹配,路由模块就会从匹配成功的路由中获取IRouteHandler接口对象。

 
 (3)路由模块调用IRouteHandler接口的GetHandler方法,并赶回用来拍卖请求的IHttpHandler对象。

 
 (4)调用HTTP处理程序中的ProcessRequest方法,然后把要处理的呼吁传递给它

   (5)在ASP.NET
MVC中,IRouteHandler是MvcRouteHandler类的一个实例,MvcRouteHandler转而回到一个贯彻了IHttpHandler接口的MvcHandler对象。再次来到的MvcHandler对象紧要用来实例化控制器,并调
       用该实例化的控制器上的操作方法。

4.2 路由数据

   
调用GetRouteData方法会重返RouteData的一个实例。RouteData中包含了关于匹配请求的路由音信。

   
如URL:{Controller}/{action}/{id}。当请求/albums/list/123传到时,该路由就会尝试匹配传入的哀告,如若配合成功,它就创办一个字典,其中涵盖了从URL中剖析出的信息。确切地讲,路由还会向Values字典中为URL中的每个路由参数添加一个键;对于传统路由{Controller}/{action}/{id},Values字典中应该至少含有四个键,分别是Controller,action和id,倘使传入的URL是对/albums/list/123的伸手,路由就会分析该请求的URL,并为字典的键提供值。本例中,字典中“Controller”键的值为albums,”action”键的值为“list”,”id”键的值是“123”;对于特性路由MVC使用DataTokens字典来存储更纯粹的消息,而不是操作名称字符串。具体来说,它涵盖一个操作描述符列表,这个描述符间接指向路由匹配时可能应用的操作方法。对于控制器级其它特色路由,列表上校有随地一个操作。在整个MVC中都有应用的RequestContext的RouteData属性保存着外面路由值。

5 路由调试

 
 使用RouteDebugger调试,启用RouteDebugger后,它会用一个DebuggerRouteHandler替换所有路由处理程序,DebugRouteHandler截获所有传入的乞请,并查询路由表中的每一个路由,以便在页面底部显示路由的诊断数据和参数。为利用RouteDebugger,只需在VS的Package
Manager Console窗口中动用NuGet安装即可,命令Install-Package
routedebugger.。RouteDebugger包在添加Route
Debugger程序集的同时。也在web.config文件的appSettings节点中添加一个安装,用来打开或禁用路由调试。

<add key="RouteDebugger:Enable" value="true'>

 只要启用RouteDebugger,它就显得从(在地方栏中)当前呼吁URL中领到的路由数据。如此,可以在地点栏中输入各样URL,并查阅输入的URL能与哪些路由万分,在页面底部,它还会来得一个分包应用程序定义的所用路由列表,这样能够查看定义的哪位路由可以与当前URL相匹配。

设置教程如下:

视图=>其他窗口=>程序包管理控制台

图片 37

在窗口中输入:Install-Package
routedebugger

图片 38

要么也可以运用NuGet很便宜的装置RouteDebugger,在项目方面右键-“Manage
NuGet Packages”-“Online”输入”RouteDebugger”然后”Install”.

理所当然, 你也足以协调下载RouteDebugger.dll,
引用到web项目中, 然后手动在web.config中进入

<add key="RouteDebugger:Enabled" value="true" />

测试结果

RouteConfig.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 using System.Web.Routing;
 7 
 8 namespace MVCDemo
 9 {
10     public class RouteConfig
11     {
12         public static void RegisterRoutes(RouteCollection routes)
13         {
14             routes.MapMvcAttributeRoutes();//
15 
16             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
17 
18             routes.MapRoute(
19                 name: "Default",
20                 url: "{controller}/{action}/{id}",
21                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
22             );
23         }
24     }
25 }

RouteDemoController

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace MVCDemo.Controllers
 8 {
 9     public class RouteDemoController : Controller
10     {
11         //
12         // GET: /RouteDemo/
13         public ActionResult Index()
14         {
15             return View();
16         }
17     }
18 }

Index

1 @inherits System.Web.Mvc.WebViewPage
2 
3 <h2>RouteDebugger调试</h2>

 

图片 39

6 与路由相关的要害命名空间和类

 6.1  路由涉及的命名空间

图片 40

 6.2 Class
Reference( 路由涉及到的首要性类)

图片 41

 

7 总结

 由于篇幅有限,路由章节就写到这,当然,还有好多内容没写,如路由安排文件、路由平安设置、自定义路由约束等,留给读者朋友们去探讨吗。

8 参考文献

 【01】https://msdn.microsoft.com/en-us/library/cc668201.aspx\#setting\_default\_values\_for\_url\_parameters

【02】http://www.cnblogs.com/willick/p/3343105.html

【03】https://msdn.microsoft.com/zh-cn/library/cc668201(v=vs.100).aspx

【04】Professional Asp.net MVC 5

【05】http://www.cnblogs.com/liangxiaofeng/p/5620033.html

【06】https://msdn.microsoft.com/en-us/library/cc668177.aspx

【07】https://msdn.microsoft.com/en-us/library/dd535620.aspx

【08】https://msdn.microsoft.com/en-us/library/cc668176.aspx

【09】https://msdn.microsoft.com/en-us/library/dd329551.aspx

【10】https://msdn.microsoft.com/en-us/library/system.web.routing.route.aspx

【11】https://msdn.microsoft.com/en-us/library/system.web.routing.pageroutehandler.aspx

【12】https://msdn.microsoft.com/en-us/library/system.web.mvc.mvcroutehandler.aspx

【13】https://msdn.microsoft.com/en-us/library/system.web.ui.page.routedata.aspx

【14】https://msdn.microsoft.com/en-us/library/bb398900.aspx

【15】https://msdn.microsoft.com/en-us/library/ee941656.aspx

 

9   版权

 

  • 感谢您的读书,若有不足之处,欢迎指教,共同学习、共同提升。
  • 博主网址:http://www.cnblogs.com/wangjiming/。
  • 极少一些作品利用读书、参考、引用、抄袭、复制和粘贴等多种主意结合而成的,大部分为原创。
  • 如您喜爱,麻烦推荐一下;如你有新想法,欢迎指出,邮箱:2016177728@qq.com。
  • 可以转载该博客,但无法不出名博客来源。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图