最近研究了一下MVC,因为平时使用WebForm比较多,但是现在流行MVC,也是进行了研究。
同样是,学习一个模块,然后在看的时候,写学习笔记。那么接下来,正文开始。
MVC项目条目摘要
App_Data 用于放置私有数据,如数据库文件等。
App_Start 包含路由和过滤器的定义,项目的核心配置。
Areas 区域是把一个大型程序划分成较小的片段方法
bin 程序集
Content 静态内容,CSS 图片 等
Controllers 控制器
Models 视图模型与域模型类
Scripts 脚本与Javascript库
Views 视图与分布视图
Views/Shared 布局视图
Views/Web.config 视图配置文件,默认导入视图的命名空间
Global.asax 全局应用程序类,用于注册路由配置,初始化等
Web.config 应用程序配置文件
路由
Web Form情况下,每个ASPX页面既是文件,又是对请求的自包含相应。这样会使URL与服务器文件有直接的关系。
MVC情况下,请求是由控制器类中的动作方法进行处理。没有对文件的一对一关系。
为了处理URL,ASP.NET平台提供了 路由系统。
路由系统有两个功能:
1.输入URL,并推断请求想要那个控制器和动作。
2.输出URL,是在视图渲染HTML中出现的URL。可点击的URL。
MVC框架中有两种方法可以创建路由:约定路由 和 属性路由。
约定路由
App_Start 文件夹中的 RouteConfig 用来定义路由。由Global.asax.cs文件进行调用。定义片段应使用{}
Global.asax.cs 文件,注册区域路由与全局路由
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); //注册区域路由 RouteConfig.RegisterRoutes(RouteTable.Routes); //注册全局路由 }
RouteConfig文件,注册路由
routes.MapRoute("MyRoutes", "{controller}/{action}"); //用于注册路由
注册路由并定义默认值,如不输入路由,则默认跳转。应该放到路由注册的最下方。
routes.MapRoute("MyRoutes", "{controller}/{action}", new { controller = "Home", action = "Index" }); //注册路由并定义默认值
定义路由别名,可以输入:http://localhost/Public 。 应在默认路由上方,则优先执行此方法,否则404错误。
routes.MapRoute("", "Public/{controller}/{action}", new { controller = "Admin", action = "Index" }); //路径别名
仅默认控制器,需传输动作方法
routes.MapRoute("ShopSchema", "Shop/{action}", new { controller = "Home" }); //仅默认控制器,需传输动作方法
设置路由别名,输入:http://localhost/Shop/OldAction 则进行跳转。
routes.MapRoute("ShopSchema2", "Shop/OldAction", new { controller = "Home", action = "Index" }); //设置路由别名
设置id变量。变量可以使用,RouteData.Values["id"]; 进行获取。或者使用参数变量进行获取。public ActionResult Index(string id){}
routes.MapRoute("MyRoutes", "{controller}/{action}/{id}", new { controller = "Home", action = "Index",id="DefaultId" }); //设置id变量
定义可选URL片段。此时id变量是可选的。
routes.MapRoute("MyRoutes", "{controller}/{action}/{id}", new { controller = "Home", action = "Index",id = UrlParameter.Optional });
定义可变长路由。此时catchall存放的所有的变量,使用/进行分割。
routes.MapRoute("MyRoutes", "{controller}/{action}/{id}/{*catchall}", new { controller = "Home", action = "Index",id = UrlParameter.Optional });
按命名空间控制优先级,如同一个解决方法存在两个同名的控制器,可以根据命名空间进行区分。
命名空间,并非按照顺序区分,是同等级区分。下方代码,会优先查询Controllers此命名空间。如命名空间数组中,同名控制器依然存在,则报错。
routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new[] { "UrlsAndRoutes.Controllers" });
禁用搜索命名空间
Route myRoute = routes.MapRoutes(...); myRoute.DataTokens["UseNamespaceFallback"] = false;
约束路由
通过正则表达式来进行约束。例如只匹配H开头的URL
routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new { controller = "^H.*" }, new[] { "UrlsAndRoutes.Controllers" });
约束到一组指定的值。action可以是Index 或 CustomVariable
routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new { action = "Index|CustomVariable" }, new[] { "UrlsAndRoutes.Controllers" });
Http方法约束。只有Get方法可以进行调用。
routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new { httpMethod = new HttpMethodConstraint("Get") }, new[] { "UrlsAndRoutes.Controllers" });
类型约束(值约束)
routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new { id = new RangeRouteConstraint(10, 20) }, new[] { "UrlsAndRoutes.Controllers" });
组合约束
routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new { id = new CompoundRouteConstraint(new IRouteConstraint[] { new RangeRouteConstraint(10, 20), new MinLengthRouteConstraint(6) }) }, new[] { "UrlsAndRoutes.Controllers" });
路由属性类包含
AlphaRouteConstraint() 匹配字母字符
BoolRouteConstraint() 匹配可解析成bool类型的值
RangeRouteConstraint(min,max) 匹配一个值范围在min和max之间
具体内容参考:System.Web.Http.Routing.Constraints 命名空间
自定义约束
可以通过实现IRouteConstraint接口,来自定义约束。最终返回bool值。略
属性路由
MVC5增加了对属性路由的支持。可以自由地与标准的基于约定的路由相混合。默认情况下属性路由是禁用的。
启用和运用属性路由
routes.MapMvcAttributeRoutes(); 启用属性路由
// http://localhost:59518/Test [Route("Test")] public ActionResult Index() { ViewBag.Controller = "Home"; ViewBag.Action = "Index"; return View("ActionName"); }
使用片段变量创建路由
// http://localhost:59518/Test/123 [Route("Test/{id}")] public ActionResult CustomVariable(string id = "DefaultId") { ViewBag.Controller = "Home"; ViewBag.Action = "CustomVariable"; ViewBag.CustomVariable = id ?? "<no value>"; return View(); }
使用路由约束,约束id必须为int类型。
[Route("Test/{id:int}")]
组合类型约束
[Route("Test/{id:alpha:length(6)}")]
控制器普通前缀,需要在class进行约束定义
[RoutePrefix("Users")]
占位符