特性路由

特性路由是对现有路由系统的扩展,提供了一种针对某个具体Controller类型或Action方法的路由注册方式。从而可以对路由规则进行细粒度的设计。

特性路由(Attribute Route)就是利用标注在Controller类型或Action方法上的特性来提供路由规则的路由注册方式。

1、 注册

默认情况下特性路由功能是关闭的,需要调用RouteCollection的扩展方法MapMvcAttributeRoutes来开启。

这个方法的调用要放在路由注册之前。

public static void RegisterRoutes(RouteCollection routes)

{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
    RouteTable.Routes.MapMvcAttributeRoutes();
 
    routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}
 
public class MoviesController : Controller

{
    // GET: Movies
    public ActionResult Index()
    {
        return View();
    }
    [HttpGet]
    [Route("movies/{id}")]
    public ActionResult GetMoviesById(string id)
    {
        ViewBag.id = id;
        return View();
    }
    [HttpGet]
    [Route("movies/starring/{starring}")]
    [Route("movies/starring/{starring}/{genre}")]
    [Route("movies/director/{director}/{genre}")]
    public ActionResult FindMovies(string starring, string director, string genre)
    {
        ViewBag.starring = starring;
        ViewBag.director = director;
        ViewBag.genre = genre;
        return View();
    }
}

默认情况下使用特性类型RouteAttribute,它实现了接口IRouteInfoProvider。

当使用RouteAttribute时,需要提供一个路由模版来对Template这个只读属性进行初始化。而如果需要用这个路由特性注册的路由对象来生成URL,还需要为它提供一个Name,以便可以从路由表中把它提取出来。

2、 为特性路由的变量添加约束

路由变量基本都会直接绑定到目标Action方法相应的参数上,由于这些变量值在请求URL中以字符串的形式体现,所以被绑定参数必需支持源自字符串的类型转换。

为了确保参数绑定的正常进行,需要对路由变量在数据类型上进行约束。这些约束可以直接以内联的形式定义在路由模版里。

[HttpGet]

[Route("movies/{id:range(20,50)}")]
public ActionResult GetMoviesById(int id)

对于路由系统来说,约束通过RouteContraint对象来表示,所有RouteContraint类型均实现了IRouteContraint接口。

特性路由的这些以内联形式定义在路由模版中的约束,它们的约束类型也是实现了IRouteContraint接口。

系统提供的约束
约束 描述 用法 类型
bool 类型匹配 (布尔类型) {x:bool} BoolRouteContraint
datetime 类型匹配 (DateTime类型) {x:datetime} DateTimeRouteContraint
decimal 类型匹配 (Decimal类型) {x:decimal} DecimalRouteContraint
double 类型匹配 (Double类型) {x:double} DoubleRouteContraint
float 类型匹配 (Float类型) {x:float} FloatRouteContraint
guid 类型匹配 (Guid类型) {x:guid} GuidRouteContraint
int 类型匹配 (32位整数) {x:int} IntRouteContraint
long 类型匹配 (64位整数) {x:long} LongRouteContraint
alpha 字符组成(必须有拉丁字母组成) {x:alpha} AlphaRouteContraint
regex 字符组成(必须与指定的正则匹配) {x:regex(^\d{3}-\d{3}-\d{4}$)} RegexRouteContraint
max 值范围(小于或等于指定的最大值) {x:max(20)} MaxRouteContraint
min 值范围(大于或等于指定的最小值) {x:max(20)} MinRouteContraint
range 值范围(在指定的最大值和最小值之间) {x:range(20,50)} RangeRouteContraint
maxlength 字符串长度(小于或等于指定的最大长度) {x:maxlength(20)} MaxLengthRouteContraint
minlength 字符串长度(大于或等于指定的最小长度) {x:minlength(20)} MinlengthRouteContraint
length 字符串长度(等于指定的长度或者在指定的范围内) {x:length(6)} LengthRouteContraint

3、 为路由变量设置缺省值

1.将对应的参数定义为可缺省参数,路由模版里使用“?”

[HttpGet]

[Route("movies/language/{language?}")]
public ActionResult GetMoviesByLanguage(string language = "en")
{
    return View();
}

2.将默认值定义在路由模版中

[HttpGet]

[Route("movies/language/{language=en}")]
public ActionResult GetMoviesByLanguage(string language)
{
    return View();
}

4、 设置模版前缀

使用RoutePrefixAttribute类型的特性,它只有一个只读属性Prefix,表示目标Controller所有Action方法共享的URL前缀。这个属性只能应用在Controller类型上,且只能有一个。

[RoutePrefix("movies")]

public class MoviesController : Controller
{
    [HttpGet]
    [Route("{id:range(20,50)}")]
    public ActionResult GetMoviesById(int id)
    {
        ViewBag.id = id;
        return View();
    }
    [HttpGet]
    [Route("starring/{starring}")]
    [Route("starring/{starring}/{genre}")]
    [Route("director/{director}/{genre}")]
    public ActionResult FindMovies(string starring, string director, string genre)
    {
        ViewBag.starring = starring;
        ViewBag.director = director;
        ViewBag.genre = genre;
        return View();
    }
 
    [HttpGet]
    [Route("~/actors/{criteria}")] //使用“~”为前缀,屏蔽掉Controller类型上的前缀“movies”
    public ActionResult FindActors(string criteria)
    {
        return View();
    }
}

5、 设置Area名

使用RouteAreaAttribute类型的特性,它由两个属性AreaName和AreaPrefix,默认情况下使用AreaName做模版前缀,如果希望具有一个不同于Area名称的前缀,则要通过设置AreaPrefix属性来实现。

如果没有使用字符“~”前缀,特性路由的完整格式为{AreaPrefix}/{RoutePrefix}/{Template} 或者{AreaName}/{RoutePrefix}/{Template} 。

[RouteArea("MoviesArea")]//[RouteArea()]

[RoutePrefix("movies")]
public class MoviesController : Controller
{
    [HttpGet]
    [Route("{id:range(20,50)}")]
    public ActionResult GetMoviesById(int id)
    {
        ViewBag.id = id;
        return View();
    }
    [HttpGet]
    [Route("starring/{starring}")]
    [Route("starring/{starring}/{genre}")]
    [Route("director/{director}/{genre}")]
    public ActionResult FindMovies(string starring, string director, string genre)
    {
        ViewBag.starring = starring;
        ViewBag.director = director;
        ViewBag.genre = genre;
        return View();
    }
 
    [HttpGet]
    [Route("~/admin/actors/{criteria}")] //使用“~”为前缀,屏蔽掉Controller类型上的前缀“movies”
    public ActionResult FindActors(string criteria)
    {
        return View();
    }
}

6、 直接应用到Controller上的RouteAttribute

[RouteArea("vedio")]

[RoutePrefix("movies")]
[Route("{action}/{id}", Name = "FindMovies")]
public class MoviesController : Controller
{
    public ActionResult Index(string id)
    {
        throw new NotImplementedException();
    }
}
 

Asp.Net MVC :路由器的更多相关文章

  1. 七天学会ASP.NET MVC (四)——用户授权认证问题

    小编应各位的要求,快马加鞭,马不停蹄的终于:七天学会 Asp.Net MVC 第四篇出炉,在第四天的学习中,我们主要了学习如何在MVC中如何实现认证授权等问题,本节主要讲了验证错误时的错误值,客户端验 ...

  2. 七天学会ASP.NET MVC (四)——用户授权认证问题 【转】

    http://www.cnblogs.com/powertoolsteam/p/MVC_four.html 小编应各位的要求,快马加鞭,马不停蹄的终于:七天学会 Asp.Net MVC 第四篇出炉,在 ...

  3. Asp.Net MVC<四>:路由器

    路由的核心类型基本定义于System.Web.dll中,路由机制同样可应用与Web Forms,实现请求地址和物理文件的分离. web form中使用路由器的示例 路由配置 protected voi ...

  4. .NET、C#和ASP.NET,ASP.NET MVC 四者之间的区别

    经常,会有一些人搞不清楚.NET和c#和ASP.NET这三者之间的关系,她们都是什么呢?他们之间有什么关系呢?总结一下 首先:什么是.NET? .NET是微软公司下的一个开发平台,.NET核心就是.N ...

  5. 学习ASP.NET MVC(四)——我的第一个ASP.NET MVC 实体对象

    今天我将根据数据库中的表结构添加一些类.这些类将成为这个ASP.NET MVC应用程序中“模型”的一部分.       我们使用Entity Framework(实体框架)来定义和使用这些模型类,并且 ...

  6. .NET、C#和ASP.NET、ASP.NET MVC四者之间的区别

    什么是.NET? .NET是微软公司下的一个开发平台,.NET核心就是.NET Framwork(.NET框架)是.NET程序开发和运行的环境,在这个平台下可以用不同的语言进行开发,因为.NET是跨语 ...

  7. ASP.NET MVC 四种传值方法

    1.后台传值: public class DataController : Controller { // GET: Data public ActionResult Index() { //1 Vi ...

  8. ASP.NET MVC 四种Controller向View传值方法

    控制器: // Get: Data public ActionResult Index() { //ViewData 方式 ViewData["UserName"] = " ...

  9. 七天学会ASP.NET MVC (四)——Layout页面使用和用户角色管理 (代码下载)

    中文翻译链接: http://www.cnblogs.com/powertoolsteam/p/MVC_four.html 360云盘: https://yunpan.cn/cYuEeLtXUvrgC ...

随机推荐

  1. __slots__ Python Class限制添加属性

    正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: class Student(object): pa ...

  2. 【Socket】linux黑客之网络嗅探底层原理

      1.mystery引入 1)网络嗅探属于网络攻防类的安全软件,其基于原始套接字技术开发的 2)原始套接字是一种套接字底层技术,它工作在网络层 3)谈到网络安全,刚好本学期学过这门课程,这里myst ...

  3. 解决kafka集群由于默认的__consumer_offsets这个topic的默认的副本数为1而存在的单点故障问题

    抛出问题: __consumer_offsets这个topic是由kafka自动创建的,默认50个,但是都存在一台kafka服务器上,这是不是就存在很明显的单点故障?经测试,如果将存储consumer ...

  4. 当滚动列表的时候,让input框失去焦点(移动端会收起键盘)

    1.拓展scroll.vue事件 beforeScroll:{ type:Boolean, default:false } if(this.beforeScroll){//滚动列表的时候收起键盘(移动 ...

  5. Java获取 ISO 8601格式时间

    https://blog.csdn.net/fang323619/article/details/74909587 ****************************************** ...

  6. How to disable SSL certificate checking with Spring RestTemplate?(使用resttemplate访问https时禁用证书检查)

    How to disable SSL certificate checking with Spring RestTemplate?(使用resttemplate访问https时禁用证书检查) **** ...

  7. ubuntu 16.04如何生成ssh key以及如何查看ssh key

    检查本地是否有SSH Key存在 在终端输入 ls -al ~/.ssh 如果输出的是: No such file or directory 那就没有ssh key 如果有就会出现这样: 生成新的SS ...

  8. C#学习笔记(27)——委托排序(1)

    说明(2017-11-20 17:21:35): 1. 感觉难点都在冒泡排序上..貌似之前跳过去了没学啊!冒泡排序的精髓就在于,两两比较,最大的排到最后一位,再把前面的重新两两比较,把最大的排到倒数第 ...

  9. 用Total Commander for Android管理应用程序

    用Total Commander for Android管理应用程序 前不久安装了一个Total Commander的Anroid版本,除了用它来管理文件之外,我发现用它管理已安装程序挺不错的. 可以 ...

  10. Bootstrap Popover 隐藏的Javasript方法

    Bootstrap Popover是Bootstrap的弹出提示控件.我们可以通过data属性或者Javascript来调用该控件.data属性调用定制性较差这里就不细说了,我们讲一下Javascri ...