MVC5 属性路由
属性路由(attribute routing)是最新被引进到MVC5中的,它和传统路由共同组成了mvc5中的两种主要路由.
1. 高质量的url应该满足以下几点
- 域名便于记忆和拼写
- 简短
- 便于输入
- 可以反映出站点结构
- 应该是“可破解的”,用户可以通过移除url的末尾,进而到达更高层次的信息体系结构(URLs that are hackable to allow users to move to higher levels of the information architecture by hacking off the end of the URL)
- 持久不能改变
在MVC5中URL(Uniform Resource Locator)统一资源定位器 中的Resource代表抽象的概念,可以代表一个文件,也可以代表方法调用返回的结果,或者其他一些资源。
URI 代表 Uniform Resource Identifier,即同一资源标识符,
2. MVC中包含有两种路由:属性路由和传统路由
路由是你应用程序的入口点(entry points)。
A route definition starts with a URL template, which specifies the pattern that the route will match.
路由以其匹配的url模板开始
组合使用属性路由和传统路由
在实际应用场景中,通常在RegisterRoutes方法中将属性路由置于传统路由之前,因为属性路由和传统路由重叠的话,mvc会优先选择先注册的路由。属性路由一般应用于专用场景而传统路由更偏向于通用场景。
比如你有一个使用传统路由的应用程序,现在你想增加一个新的控制器去使用属性路由,这将是很容易办到的。
首先启用属性路由
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapMvcAttributeRoutes(); //启用属性路由
routes.MapRoute("simple",
"{controller}/{action}/{id}",
new {action = "index", id = UrlParameter.Optional}); }
然后,应用属性路由到具体的控制器中
// Existing class
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
return View();
}
public ActionResult Contact()
{
return View();
}
}
[RoutePrefix("contacts")]
[Route("{action=Index}/{id?}")]
public class NewContactsController : Controller
{
public ActionResult Index()
{
// Do some work
return View();
}
public ActionResult Details(int id)
{
// Do some work
return View();
}
public ActionResult Update(int id)
{
// Do some work
return View();
}
public ActionResult Delete(int id)
{
// Delete the contact with this id
return View();
}
}
3. 具体选用属性路由还是传统路由呢?
以下场景建议选择属性路由
a. 你希望你的路由和你的action在一起
b. 你重新创建一个新的应用程序,或者你对应用程序做重大修改时
以下场景建议选择传统路由
a. 你想集中配置你所有的路由
b. 你使用自定义约束对象
c. 你不想改变已经存在的应用程序
下面是建议使用属性路由的英文描述:
The centralized configuration of traditional routes means there’s one place to go to understand how
a request maps to an action. Traditional routes also have some more flexibility than attribute routes.
For example, adding a custom constraint object to a traditional route is easy. Attributes in C# only
support certain kinds of arguments, and for attribute routing, that means everything is specified in
the route template string.
On the other hand, attribute routing nicely keeps everything about your controllers together, including
both the URLs they use and the actions that run. I tend to prefer attribute routing for that
reason. Fortunately, you can use both and moving a route from one style to the other if you change
your mind is not difficult.
MVC5 属性路由的更多相关文章
- 【翻译】ASP.NET MVC 5属性路由(转)
转载链接:http://www.cnblogs.com/thestartdream/p/4246533.html 原文链接:http://blogs.msdn.com/b/webdev/archive ...
- WebApi 2:属性路由 [Route()],attribute routing
原文:http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 属性 ...
- Asp.Net Web API 2第八课——Web API 2中的属性路由
前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 路由就是Web API如何 ...
- [水煮 ASP.NET Web API2 方法论](3-2)直接式路由/属性路由
问题 怎么样可以使用更贴近资源(Controller,Action)的方式定义路由. 解决方案 可以使用属性路由直接在资源级别声明路由.只要简单的在 Action 上使用属性路由 RouteAttri ...
- ASP.NET Web API 2 中的属性路由使用(转载)
转载地址:ASP.NET Web API 2 中的属性路由使用
- WebApi(三)-属性路由 自定义访问路径
启用属性路由: 1.在WebApiConfig中加入如下代码: //属性路由 config.MapHttpAttributeRoutes();
- Web API 2中的属性路由
Web API 2中的属性路由 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.ht ...
- MVC 5 属性路由中添加自己的自定义约束
介绍约束 ASP.NET MVC和web api 同时支持简单和自定义约束,简单的约束看起来像: routes.MapRoute("blog", "{year}/{mon ...
- Web API中的路由(二)——属性路由
一.属性路由的概念 路由让webapi将一个uri匹配到对应的action,Web API 2支持一种新类型的路由:属性路由.顾名思义,属性路由使用属性来定义路由.通过属性路由,我们可以更好地控制We ...
随机推荐
- data URI scheme
优化网页效能,首要的任务是尽量减少HTTP请求(http request)的次数,例如把多个JavaScript文档合并,多个CSS文件合并等等.此外,还有有一种 data URL 的方法,可以直接把 ...
- OpenResty(nginx扩展)实现防cc攻击
OpenResty(nginx扩展)实现防cc攻击 导读 OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强 ...
- 技术随笔 查找速度最快的Google IP
转:http://www.xiumu.org/technology/the-find-the-fastest-in-the-google-ip.shtml 体验秒开GOOGLE的感觉! 在http:/ ...
- Socket 之 同步以及异步通信
用netstat侦听下端口状态 同步通信: 预定义结构体,同步通信没有多线程异步委托回调,所以无需预定义结构体 客户端Client: class Program { static void Main( ...
- 关于linux系统安全配置脚本
本脚本是第二次更新,已经大量应用在某大型媒体网站体系中,加入了之前没有想到的一些安全设置.使用方法将其复制,保存为一个shell文件,比如security.sh.将其上传到Linux服务器上,执行sh ...
- mysql索引补充
索引补充 1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引,会保存在额外的文件中. 2.索引种类 普通索引:仅加速查询 唯一索引:加速查询 + 列 ...
- C#实现DNS解析服务
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnUAAAENCAIAAADmDAQyAAAat0lEQVR4nO3dbXRU9YHH8ftq2+1uT7
- c++ STL:队列queue、优先队列priority queue 的使用
说明:本文全文转载而来,原文链接:http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html C++ Queues(队列) C ...
- Django中创建自己的Context_Processors
在settings.py中有一个变量TEMPLATE_CONTEXT_PROCESSORS 一般它担任对我们的模板页面与环境进行处理解析的过程 比如原来默认的django不能在template中使 ...
- PHP 中mysql如何实现事务提交?
事务就是指对数据库的多次修改,要么全部成功,要么全部失败,不能出现部分修改成功,部分修改失败的情况. PHP下操作mysql数据库要实现事务提交,需注意以下方面: 1, 数据库表存储引擎类型设置为in ...