Asp.Net MVC :路由器
特性路由
特性路由是对现有路由系统的扩展,提供了一种针对某个具体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 :路由器的更多相关文章
- 七天学会ASP.NET MVC (四)——用户授权认证问题
小编应各位的要求,快马加鞭,马不停蹄的终于:七天学会 Asp.Net MVC 第四篇出炉,在第四天的学习中,我们主要了学习如何在MVC中如何实现认证授权等问题,本节主要讲了验证错误时的错误值,客户端验 ...
- 七天学会ASP.NET MVC (四)——用户授权认证问题 【转】
http://www.cnblogs.com/powertoolsteam/p/MVC_four.html 小编应各位的要求,快马加鞭,马不停蹄的终于:七天学会 Asp.Net MVC 第四篇出炉,在 ...
- Asp.Net MVC<四>:路由器
路由的核心类型基本定义于System.Web.dll中,路由机制同样可应用与Web Forms,实现请求地址和物理文件的分离. web form中使用路由器的示例 路由配置 protected voi ...
- .NET、C#和ASP.NET,ASP.NET MVC 四者之间的区别
经常,会有一些人搞不清楚.NET和c#和ASP.NET这三者之间的关系,她们都是什么呢?他们之间有什么关系呢?总结一下 首先:什么是.NET? .NET是微软公司下的一个开发平台,.NET核心就是.N ...
- 学习ASP.NET MVC(四)——我的第一个ASP.NET MVC 实体对象
今天我将根据数据库中的表结构添加一些类.这些类将成为这个ASP.NET MVC应用程序中“模型”的一部分. 我们使用Entity Framework(实体框架)来定义和使用这些模型类,并且 ...
- .NET、C#和ASP.NET、ASP.NET MVC四者之间的区别
什么是.NET? .NET是微软公司下的一个开发平台,.NET核心就是.NET Framwork(.NET框架)是.NET程序开发和运行的环境,在这个平台下可以用不同的语言进行开发,因为.NET是跨语 ...
- ASP.NET MVC 四种传值方法
1.后台传值: public class DataController : Controller { // GET: Data public ActionResult Index() { //1 Vi ...
- ASP.NET MVC 四种Controller向View传值方法
控制器: // Get: Data public ActionResult Index() { //ViewData 方式 ViewData["UserName"] = " ...
- 七天学会ASP.NET MVC (四)——Layout页面使用和用户角色管理 (代码下载)
中文翻译链接: http://www.cnblogs.com/powertoolsteam/p/MVC_four.html 360云盘: https://yunpan.cn/cYuEeLtXUvrgC ...
随机推荐
- [SQL Server 2014] 微软将于年底发布新版数据库SQL Server 2014
在今年的TechEd大会上,微软宣布SQL Server 2014的第一个技术预览版.SQL Server 2014的重点包括内存OLTP.实时的大数据分析.支持混合云端,以及提供更完整的商业智能(B ...
- [Windows Azure] Load Balancing Virtual Machines
Load Balancing Virtual Machines All virtual machines that you create in Windows Azure can automatica ...
- C++11 delete和default
Defaulted 函数 C++ 的类有四个特殊成员函数,它们分别是:默认构造函数.析构函数.拷贝构造函数以及拷贝赋值运算符.这些类的特殊成员函数负责创建.初始化.销毁,或者拷贝类的对象. 如果程序员 ...
- 服务器搭建3 安装libevent2.0.20
1.检测是否安装 安装了的话应该是这样的:如果不是,那就装一下. root@iZ23nyl8frqZ:/home/upload# ls -a /usr/lib |grep libeventlibeve ...
- Django admin 继承user表后密码为明文,继承UserAdmin,重写其方法
Django用户继承AbstractUser后密码为明文 其实本不应该有这个问题,却花了我很久的时间,因为还是初学阶段. 造成这个原因是因为在admin注册的生活没有指定Admin 在app的admi ...
- deepNN
不做卷积,只是增加多层神经网络层. #-*- encoding:utf-8 -*- #!/usr/local/env python import numpy as np import tensorfl ...
- 设计模式之工厂方法模式(代码用Objective-C展示)
前面一篇展示了一个简单工厂模式,这一篇主要是对比,工厂方法模式比简单工厂模式好在哪里?为什么要用这个模式?这个模式的精髓在哪里? 就以计算器为例,结果图如下: 加减乘除运算都是继承自基类运算类,然后工 ...
- Eigen教程(9)
整理下Eigen库的教程,参考:http://eigen.tuxfamily.org/dox/index.html Eigen并没有为matrix提供直接的Reshape和Slicing的API,但是 ...
- Hydra扫描姿势
参数详解: -R 根据上一次进度继续破解 -S 使用SSL协议连接 -s 指定端口 -l 指定用户名 -L 指定用户名字典(文件) -p 指定密码破解 -P 指定密码字典(文件) -e 空密码探测和指 ...
- C语言 · 字符删除
算法训练 字符删除 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,先输入一个字符串str(长度不超过20),再输入单独的一个字符ch,然后程序会把字符串str ...