Asp.mvc ~ 路由
统一资源定位符 URL (Uniform Resource Locator) : 资源是一个抽象概念, 既可以指一个文件, 也可以指方法调用的结果或者服务器上的一些其他内容。
统一资源标识符 URI (Uniform Resource Identifier) : URI 是标识了一个资源的字符串, 从技术角度看, 所有的 URL 都是 URI ,URL 是 URI 的一种类型,它通过表示自身的主要访问机制来标识资源。 也就是说, URI 是某种资源的标识符, 而 URL 则为获取该资源提供了具体的信息。
路由的特点:
- 分离传入的URL与结束处理请求(物理文件路径)。
- 搜索引擎优化(SEO, Search Engine Optimization)
- 可以反映出站点结构。
- 构建 RESTful 风格的Web Application。
定义路由:
默认路由设置
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
定义特性路由
在定义特性路由之前, 我们需要在 RouteConfig.cs 使用
RouteCollection
对象来映射应用程序的特性定义路由。
routes.MapMvcAttributeRoutes();
然后设置路由特性:
[Route("home/about")] public ActionResult About() { ViewBag.Message = "Your application description page."; return View(); }
访问路由为: home/about
定义参数:
[Route("home/about/{id}/{name}")] public ActionResult About(int id , string name) { ViewBag.Message = "Your application description page."; return View(); }
访问路由为: home/about/编号/名称
也可设置可空类型参数:
[Route("home/about/{id?}/{name?}")] public ActionResult About(int? id , string? name) { ViewBag.Message = "Your application description page."; return View(); }
当然,值得注意的是如果有多个参数, 可空参数一定要放置在最后。
也可在控制器上使用 RoutePrefix 定义路由前缀, 这样就在 action 上定义路由模板的时候就不需要定义重复的控制器部分:
[RoutePrefix("home")] public class HomeController : Controller { [Route("index")] public ActionResult Index() { return View(); } }
此时 Index() 这个 Action 的访问路由为: home/index
路由约束
如果我们需要约束传入参数的格式, 比如只能传入数字格式,且最大长度为10:
[Route("about/{id:length(10)}")]
public ActionResult About(int id)
{
ViewBag.Message = "Your application description page.";
return View();
}
其中的 length 只是内联约束的一种, 还有类似于: bool, datetime, decimal, double, float, guid, int, long…
- 使用正则约束路由
使用 RouteCollection
来注册路由, 并且使用正则来对路由进行相关约束:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute("Regex", "{controller}/{action}/{id}",
new { controller = "Home", action = "About", id = @"\d{5}" });
访问路由:home/about/22222
如果有更复杂的需求, 则可以使用到正则来完成。