0。前言 在之前我们介绍了请求通过路由寻找到控制器,以及控制器与视图的数据流转。那么,我们回过头来,再看看路由的一些其他用法。 1。路由属性(RouteAttribute) 按照英文的直接翻译,RoutingAttribute的意思是路由属性,但实际上Attribute在微软的官方称呼是特性。嗯,所以个人觉得RouteAttribute应该是特性路由,路由特性。 嗯,暂且甩开称呼的问题,小伙伴们知道这是一种使用Attribute标记的路由配置方案就行。我们之前了解的路由设置都是通过路由表设置的,而RouteAttribute则是另外一种方案。 1。1如何设置 这种方案主要是通过RouteAttribute类来设置的,我们先来看一下这个类是个什么样的吧: 〔AttributeUsage(AttributeTargets。ClassAttributeTargets。Method,AllowMultipletrue,Inheritedtrue)〕 publicclassRouteAttribute:Attribute,IRouteTemplateProvider { publicRouteAttribute(stringtemplate); publicstringName{get;set;} publicintOrder{get;set;} publicstringTemplate{get;} } AttributeUsage这个特性是用来标注特性的适用范围的,其中AttributeTargets。ClassAttributeTargets。Method表示这个特性是可以设置在类或者方法上的。AllMultiple表示是否允许设置多个,Inherited表示被该特性标注的类其子类是否也自动继承了这个特性。 那么,我们了解了RouteAttribute的适用范围,继续看这个类,一共有三个属性: Name表示这个路由特性的名称 Order表示启用顺序,值越小,越先被匹配。默认情况下是0 Template路由解析模板,也就是在《【core系列】2控制器与路由的恩怨情仇》中介绍的路由表的格式串 介绍了这么多,我们先来试试看,先拿出来之前文章创建的MvcWeb项目,新建一个控制器: usingMicrosoft。AspNetCore。Mvc; namespaceMvcWeb。Controllers { publicclassRouteTestController:Controller { publicIActionResultIndex() { returnView(); } } } 创建对应视图: Viewsamp;gt;RouteTestamp;gt;Index。cshtml 在Index。cshtml中随便写点内容,然后保存。 然后,在RouteTestController添加一个Route特性标记: 〔Route(Route)〕 publicIActionResultIndex() { returnView(); } 启动项目,访问http:localhost:5006Route后,如果不出意外可以看到跟下图类似的界面: 那么我们试一试通过路由表设置的路径是否可以访问: http:localhost:5006RouteTest 可以看到提示404,也就是说这个Action无法通过路由表的形式查找到了。 1。2设置参数 我们知道所谓的Action其实也是一个方法,而我们通常请求一个网址的时候,网址中也带有一些查询参数。所以,这一节我们就介绍一下路由特性(属性路由)如何设置参数的解析吧。 1。2。1不做任何操作 在RouteTestController里添加方法: 〔Route(routenorest)〕 publicIActionResultNoRest(stringname) { ViewBag。Namename; returnView(); } 创建对应的View: lt;h1gt;ViewBag。Namelt;h1gt; 启动程序,并访问:http:localhost:5006routenorest 添加?nametest在上一个请求的后面: 尝试变更name的值,可以发现网页中的值也发生了变化,证明我们可以获取到这个值。 1。2。2当做请求目录的一部分 在上一小节中,没有对参数做任何操作,以查询参数的形式传递。在这一篇,我们可以把参数设置为请求的一部分,像目录那样,修改上一节示例代码为: 〔Route(routenorest{name})〕 publicIActionResultNoRest(stringname) { ViewBag。Namename; returnView(); } 请求方式: http:localhost:5006routenorest1232 修改连接中的1232内容,然后刷新页面,就能发现页面中的值也发生了变化 1。2。3给参数一个默认值 之前的设置里我们都默认参数由请求URL获取,那么在这里我们介绍一下给参数一个值: 〔Route(routenorest{namedemo})〕 publicIActionResultNoRest(stringname) { ViewBag。Namename; returnView(); } 访问连接: http:localhost:5006routenorest 可以看见: 设置为可空,也就是参数可以不传: 〔Route(routenorest{name?})〕 publicIActionResultNoRest(stringname) { ViewBag。Namename; returnView(); } 访问连接: http:localhost:5006routenorest 可以看到页面没有任何显示: 正常情况下,如果不对参数设置可空而且参数被我们当做目录的一部分时,不给值是会提示404。 1。3路由约束 2。路由统一前缀 在第一节中,我们介绍了如何使用RouteAttribute为控制器里的方法标记路由信息。有时候会出现这样的一个问题,一个控制器方法里可能会出现多个方法(Action)。通常情况下,我们要求一个控制器处理的请求应当有一个统一的前缀(或者称之为URL目录)。 那么,这种情况我们仍然继续使用RouteAttribute,不过与之前不同的是,这次直接在控制器类上标记: 〔Route(Route)〕 publicclassRouteCtrTestController:Controller { } 这时候,在方法上如果添加了RouteAttribute,设置的路由信息如果不是以开始,则会将该Action的路由配置加到Controller后面。如果是以开始,则表示该路由是根路由。 如果没有设置RouteAttribute,则表示当前方法是处理控制器配置的路由的方法。 如果一个控制器里出现多个未设置RouteAttribute,则会出错。 示例代码如下: 〔Route(Route)〕 publicclassRouteCtrTestController:Controller { publicinttemp{get;set;} publicIActionResultIndex(inttemp) { returnContent(你好{temp}); } 〔Route(Demo)〕 publicIActionResultDemo() { returnContent(你好Demo); } } 2。总结 今天的内容比较短,这里介绍了一些路由的另一种用法,小伙伴们对此有个了解就可以了。下一篇将会到视图,开始准备带领大家做一个小项目啦。 求关注,求点赞,求转发有啥可以评论哟