Routing(路由) – URL
url 作为广泛使用的Web用户接口,需要被重视
好的Url应该满足如下条件:
- URL应为获取某种资源提供信息,不一定是物理文件路径
- 简短易于记忆和拼写输入
- 可以反映出站点结构
- 应该是【可拆分】,用户移除末尾,进而获得更高层次信息
- 持久、不应改变
下面两种url哪种你更喜欢呢?
http://www.cnblogs.com/baka_no/1.html
http://www.cnblogs.com/baka_no/1
如果是后者,那服务器怎么识别呢?
ASP.NET MVC 使用路由机制完成由url到具体调用方法的映射过程
注:传统上,url代表服务器磁盘上的物理文件
Routing(路由)的作用
匹配传入的请求(不匹配服务器物理文件),并将请求映射到【控制器】的具体操作【Action方法】和 【参数】
调用并执行对应控制器类的Action方法
Global.asax.cs文件中定义了路由的识别规则
Routes.MapRoute( "Default", // 1.路由名称 "{controller}/{action}/{id}", // 2.带有参数的URL new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 3.参数默认值 );
注:{controller}和{action}是特定参数名,不能改
RequestContext.RouteValueDictionary
SEO:Search Engine Optimization
Routing(路由)包含字面值的URL
路由URL在段中也允许包含【字面值】,如:
/baka_no/{controller}/{action}/{id}
规定第一个段必须以 jiekzou 开头,才能与该路由匹配,如:
/baka_no/home/index/1
URL中可以字面量和参数混合在一期,如:
注:不能有两个连续的url参数 :{controller}{action}-{id}
路由约束
允许URL段使用正则表达式来限制路由是否匹配请求
routes.MapRoute( "blog", // 路由名称 "{controller}/{action}/{id}", // 带有参数的 URL new { controller = "Home", action = "Index", id = UrlParameter.Optional },// 参数默认值 new{controller=@"\d{4}",action=@"\d{2}"} );
路由按照先后顺序与传入的URL匹配,直到匹配成功为主
命名路由
生成指定路由名的 url超链接
@Html.RouteLink("test", "Default",
new {contorller="home",action ="index",id=1 } );
注:会按照找到的路由规则生成超链接(没有使用默认值)
Action返回不同值
ViewResult – 执行并读取指定的 完整视图
PartialViewResult – 指定并读取指定的 分部视图
分部视图:主要为某个页面提供部分html代码
一般用在Ajax请求()
JsonResult -> ActionResult – 请求Json数据时
return Json(object);//生成Json字符串
string – 直接返回字符串
验证码
public ActionResult VCodeImg() { VCode vcode = new VCode(); byte[] bytes = vcode.CreateVImg(); return File(bytes, @"image/jpeg"); }
获取当前请求路径:HtmlHelper.ViewContext.RequestContext.HttpContext.Request.Url.AbsolutePath;
Area 区域
MVC 项目目录结构 缺点:
1.不利于分功能协作开发(购物车/商品管理/用户权限管理…)
2.代码结构臃肿…
注:可使用Area区域解决,甚至可以从物理上分开
Area 区域 – 添加
Area 区域 展示-在同一项目中
Area包含:
一套新的MVC文件夹
**AreaRegistration.cs文件
Area 区域 展示-在不同项目中
区域路由注册类
public class WebViewsAreaRegistration : AreaRegistration { public override string AreaName { get { return "WebViews"; } } public override void RegisterArea(AreaRegistrationContext context) { //注册区域路由 context.MapRoute( "WebViews_default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new string[] { "CRM.AreaController.WebViews" }//指定该路由查找控制器类的命名空间 ); } }
Demo
1. 在解决方案上面新建一个MvcApplication1的MVC4项目
2、项目上右键->添加->Areas,输入"Admin"
3、添加控制器Home,并添加一个Index视图
4、在解决方案上面新建一个MvcApplication2的MVC4项目,并且删除Global.asax和Web.config两个文件
5. 在根目录新建一个AdminAreaRegistration的类,输入如下内容:
public class AdminAreaRegistration : AreaRegistration { public override string AreaName { get { return "Admin"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Admin_default", "Admin/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } ); } }
6. 删除MvcApplication1项目/Areas/Admin文件夹下面的AdminAreaRegistration.cs文件以及Controllers文件夹(包括HomeController)
7. 在MvcApplication2项目的Controllers里面新建一个HomeController
8. 记得保留MvcApplication1/Areas/Admin下面的Views,并且在MvcApplication1项目里面引用MvcApplication2项目
为了使我们在MvcApplication2自动生成的View自动同步到MvcApplication1/Areas/Admin/Views 文件夹中,可以使用“生成事件(Build Event)”里的“Post-Build Event”,打开MvcApplication2的属性,修改如下所示:
mkdir
"$(SolutionDir)$(SolutionName)\Areas\Admin\Views"
xcopy
"$(ProjectDir)Views"
"$(SolutionDir)$(SolutionName)\Areas\Admin\Views"
/S
/E
/C
/Y
现在再次访问/Admin/Home/Index就可以得到正确结果了,并且你可以发现Index.cshtml已经被复制到MvcApplication1/Areas/Admin/Views/Home目录里。
Area 区域运行原理