1、RouteAttribute、RoutePrefixAttribute概述
在MVC中,RouteAttribute和RoutePrefixAttribute的命名空间是System.Web.Mvc,区别与Web API的RouteAttribute和RoutePrefixAttribute(它们的命名空间是System.Web.Http)。
RoutePrefixAttribute是只用于类的特性(RouteAttribute可用于类和方法)。比如我们希望是这样的格式:http://localhost:端口/api/customers/1/orders,则应用如下:
[RoutePrefix("api")]
public class OrdersController : ApiController
{
[Route("customers/{customerId}/orders")]
[HttpGet]
public IEnumerable<Order> FindOrdersByCustomer(int customerId)
{
return Database.GetOrdersByCustomerId(customerId);
}
}
//《Web Api通过Route、RoutePrefix等特性设置路由》
// https://www.cnblogs.com/shy1766IT/p/5578807.html
// (还可以通过"{参数变量名称:约束}"来约束路由中的参数变量,详细可打开该链接)
- 在Web API中启用特性路由,需要在
App_Start
目录的WebApiConfig
类中调用 System.Web.Http.HttpConfigurationExtensions 的扩展方法MapHttpAttributeRoutes
进行配置(参与实际项目及https://www.cnblogs.com/ITusk/p/7677001.html):
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
//跨域配置
config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
config.Filters.Add((I18nFilterAttribute)GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(I18nFilterAttribute)));
var exceptionFilter = GlobalConfiguration.Configuration.DependencyResolver
.GetService(typeof(ApiExceptionFilterAttribute)) as ApiExceptionFilterAttribute;
config.Filters.Add(exceptionFilter);
// 启用Web API特性路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
- 默认情况下MVC的特征路由(RouteAttribute)功能是关闭的,需要手动启动,启动方式【MVC中是通过RouteConfig类的routes.MapMvcAttributeRoutes()启用Attribute路由】:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes(); //启用Attribute路由
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
2、RouteAttribute简单例子(MVC中)
[Route("list")]
[Route("list/{category}lb")]
[Route("list/{category}/p{page:int}ye")]
public void ArticleList(string category, int page = 1)
{
var title = string.IsNullOrEmpty(category) ? "所有资讯" : category + "资讯";
Response.Write(string.Format("分类:{0},页码:{1}<br/>测试路由属性!!!", title, page));
}
Route("list/")匹配地址:http://localhost:56123/list
-
Route("list/{category}lb")匹配地址:http://localhost:56123/list/newslb
-
Route("list/{category}/p{page:int}ye")匹配地址:http://localhost:56123/list/entertainment/p50ye
(本文例子参考https://www.cnblogs.com/amywechat/p/5767619.html进行测试并做了修正)