快速入门系列--MVC--02路由
现在补上URL路由的学习,至于蒋老师自建的MVC小引擎和相关案例就放在论文提交后再实践咯。通过ASP.NET的路由系统,可以完成请求URL与物理文件的分离,其优点是:灵活性、可读性、SEO优化。接下来通过一个最简单的路由例子进入这部分的学习,这是一个蒋老师提供的WebForm路由的例子,回想起刚做ASP.NET时,每次看到.aspx页面的前台代码时的茫然和无措,茫茫多的标签,属性,数据源的绑定吓死小兄弟俺了,也花过不少时间去理解记忆,效果不也不大。现在回头看看感觉好了很多,看到IsPostback老亲切了,觉得在理解的基础上拖拉控件也是很幸福的事情,嘿嘿。
void Application_Start(object sender, EventArgs e)
{
//路由配置
var defaults = new RouteValueDictionary { { "name", "*" }, { "id", "*" } };
RouteTable.Routes.MapPageRoute("default", "employees/{name}/{id}", "~/Default.aspx", true, defaults);
} //前台代码
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridViewEmployees" runat="server" AutoGenerateColumns="False" Width="100%">
<Columns>
<asp:HyperLinkField DataNavigateUrlFields="Name,Id" DataNavigateUrlFormatString="~/employees/{0}/{1}" DataTextField="Name" HeaderText="姓名" />
<asp:BoundField DataField="Gender" HeaderText="性别" />
<asp:BoundField DataField="Birthday" DataFormatString="{0:dd/MM/yyyy}" HeaderText="出生日期" />
<asp:BoundField DataField="Department" HeaderText="部门" />
</Columns>
</asp:GridView>
<asp:DetailsView ID="DetailsViewEmployee" runat="server" Height="50px" Width="100%" AutoGenerateRows="False">
<Fields>
<asp:BoundField DataField="Id" HeaderText="ID" />
<asp:BoundField DataField="Name" HeaderText="姓名" />
<asp:BoundField DataField="Gender" HeaderText="性别" />
<asp:BoundField DataField="Birthday" DataFormatString="{0:dd/MM/yyyy}" HeaderText="出生日期" />
<asp:BoundField DataField="Department" HeaderText="部门" />
</Fields>
</asp:DetailsView>
</div>
</form> //后台代码
public partial class Default : System.Web.UI.Page
{
private EmployeeRepository _repository;
public EmployeeRepository Repository
{
get
{
return null == _repository ? _repository = new EmployeeRepository() : _repository;
}
} protected void Page_Load(object sender, EventArgs e)
{
if (this.IsPostBack)
{
return;
}
string employeeId = this.RouteData.Values["id"] as string;
if (employeeId == "*" || string.IsNullOrEmpty(employeeId))
{
this.GridViewEmployees.DataSource = this.Repository.GetEmployees();
this.GridViewEmployees.DataBind();
this.DetailsViewEmployee.Visible = false;
}
else
{
this.DetailsViewEmployee.DataSource = this.Repository.GetEmployees(employeeId);
this.DetailsViewEmployee.DataBind();
this.GridViewEmployees.Visible = false;
}
}
}
接下来通过一个表格简要介绍下路由系统的相关类型:
类型 | 简介 |
RouteBase | 提供GetRouteData方法获得RouteData,该对象中属性RouteHandler用于提供HttpHandler对象,Values提供解析Url后的数据,DataTokens提供自己在路由类型中添加的数据;GetVirtualPath方法根据提供的变量和URL模板生成虚拟路径,是GetRouteData方法的逆过程,用于响应阶段。 |
Route | Url属性表示Url模板,如world/{country}/{city}匹配world/China/Shanghai,通配符为{*pathInfo}。Defaults属性提供模板变量默认值,Constraints提供约束条件 |
RouteTable | 静态属性Routes维护全局路由表,属性RouteExistingFiles用于控制是否需要对存在的物理文件实施路由,默认为False;属性AppendTrailingSlash和LowercaseUrls用于GetVirtualPath方法是否转变url为小写或在末尾添加"/" |
之后展示一个关于注册路由相对完整的例子,代码如下所示:
var defaults = new RouteValueDictionary { { "cityCode", "" }, { "distinctCode", } };
var constraints = new RouteValueDictionary { { "cityCode", @"0\d{2,3}" }, { "distinctCode", @"[1-7]{1}" } };
var dataTokens = new RouteValueDictionary { { "defaultCity", "Shanghai" }, { "defaultDistinct", "Pudong" } };
RouteTable.Routes.MapPageRoute("default", "{cityCode}/{distinctCode}", "~/default.aspx", false, defaults, constraints, dataTokens);
再则是介绍一些路由模块在ASP.NET MVC中的扩展,包括是UrlParameter.Optional代表缺省的URL参数,通过Area来划分系统的模块,以及HtmlHelper与UrlHelper相关的内容,相对比较简单就不一一介绍了,只是补充一个Area注册的例子加强记忆,代码如下:
public class WeatherAreaRegistration : AreaRegistration
{
public override string AreaName
{
get { return "Weather"; }
}
public override void RegisterArea(AreaRegistrationContext context)
{
object defaults = new
{
areacode = "",
days = ,
defaultCity = "BeiJing",
defaultDays =
};
object constraints = new { areacode = @"0\d{2,3}", days = @"[1-3]{1}" };
context.MapRoute("weatherDefault", "weather/{areacode}/{days}", defaults, constraints);
}
}
最后来说说整个路由系统是如何实现的,正如蒋老师所说,是通过HttpHandler的动态映射来实现的。UrlRoutingModule实现了IHttpModule,通过注册HttpApplication的PostResolveRequestCache事件对请求进行拦截,并利用路由表与请求URL进行模式匹配得到相应的路由数据,并获得关联的HttpHandler用于处理请求。注意PageRouteHandler和MvcRouteHanlder分别针对WebForm和MVC,部分相关代码如下所示:
public class UrlRoutingModule:IHttpModule
{
public RouteCollection RouteCollection { get; set; }
public void Init(HttpApplication context)
{
context.PostResolveRequestCache += new EventHandler(this.OnApplicationPostResolveRequestCache);
} private void OnApplicationPostResolveRequestCache(object sender, EventArgs e) {
HttpContext context = ((HttpApplication)sender).Context;
HttpContextBase contextWrapper = new HttpContextWrapper(context);
RouteData routeData = this.RouteCollection.GetRouteData(contextWrapper);
RequestContext requestContext = new RequestContext(contextWrapper, routeData);
IHttpHandler handler = routeData.RouteHandler.GetHttpHandler(requestContext);
context.RemapHandler(handler);
}
//omit
}
Tip: ASP.NET的处理过程始终是Request->HttpModule->HttpHandler->Response,
对了,现在关于Owin的相关内容很火,感觉其就是J2EE标准规范的.NET版本,提供规范与接口,大家一起来做好它的感觉。简单来说就是现在只有IIS支持ASP.NET管道,而JAVA却有Tomcat,Weblogic等很多优质的Web服务器支持Servlet,今后我们也可以在很多开源高效的Web服务器上搭建.NET应用了,因为它们一定会简化现有的ASP.NET管道,让XXXing,XXXed离我们远一点吧。真心的说,以前面试的时候感觉好难背,哈哈。
如果需要在mvc代码中进行分离,下图标红处的设置最为关键。
系列目录如下,谢谢您的阅读。
注:本文主要供自己学习,不妥之处望见谅。
参考资料:
[1]蒋金楠. ASP.NET MVC4框架揭秘[M]. 上海:电子工业出版社, 2012. 35-85
快速入门系列--MVC--02路由的更多相关文章
- 快速入门系列--WebAPI--01基础
ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...
- 快速入门系列--WebAPI--03框架你值得拥有
接下来进入的是俺在ASP.NET学习中最重要的WebAPI部分,在现在流行的互联网场景下,WebAPI可以和HTML5.单页应用程序SPA等技术和理念很好的结合在一起.所谓ASP.NET WebAPI ...
- 快速入门系列--WebAPI--04在老版本MVC4下的调整
WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了.在之前的介绍中,基本上都基于.NET 4.5之后版本,其System.N ...
- 快速入门系列--MVC--01概述
虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入.其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的 ...
- 快速入门系列--MVC--07与HTML5移动开发的结合
现在移动互联网的盛行,跨平台并兼容不同设备的HTML5越来越盛行,很多公司都在将自己过去的非HTML5网站应用渐进式的转化为HTML5应用,使得一套代码可以兼容不同的物理终端设备和浏览器,极大的提高了 ...
- [转]快速入门系列--WebAPI--01基础
本文转自:http://www.cnblogs.com/wanliwang01/p/aspnet_webapi_base01.html ASP.NET MVC和WebAPI已经是.NET Web部分的 ...
- vue 快速入门 系列 —— vue-cli 下
其他章节请看: vue 快速入门 系列 Vue CLI 4.x 下 在 vue loader 一文中我们已经学会从零搭建一个简单的,用于单文件组件开发的脚手架:本篇,我们将全面学习 vue-cli 这 ...
- WPF快速入门系列(1)——WPF布局概览
一.引言 关于WPF早在一年前就已经看过<深入浅出WPF>这本书,当时看完之后由于没有做笔记,以至于我现在又重新捡起来并记录下学习的过程,本系列将是一个WPF快速入门系列,主要介绍WPF中 ...
- vue 快速入门 系列 —— 初步认识 vue
其他章节请看: vue 快速入门 系列 初步认识 vue vue 是什么 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架. 所谓渐进式,就是你可以一步一步.有阶段 ...
随机推荐
- Bootstrap的安装
在了解了HTML和CSS.JS之后,我咨询了之前做过这一块的学长,得知了Bootstrap的存在. Bootstrap (Web前端CSS框架) Bootstrap,来自 Twitter,是目前很受欢 ...
- ubuntu下面mysql,通过载入txt文件初始化数据表
环境:ubuntu12.04 mysql(通过apt安装) (1)根据数据表中的属性列,对应在txt中构造记录(一行对应一条记录),不同属性之间通过tab键(以/root目录下构建的init.tx ...
- ELb表达式
主要用于servlet的4个作用域取值:pageScope.requestScope.sessionScope.applicationScope 取值顺序依次从小到大.取值方式如:操作javabean ...
- 在C#中简单调用FindWindow控制其他程序
C#本身是没有FindWindow这个函数的, 为什么没有呢? 很简单,C#毕竟是微软自家开发出来的.而WIN API中本来封装了很多对窗口的操作,所以当然能重用的就要重用,这些封装好的函数一般在系统 ...
- 以 Composer 的方式在 PhpStorm 中添加代码审查工具 Code Sniffer
一.前提条件 Windows 操作系统 可以在本地运行的 PHP 环境,个人用的是 laragon PhpStorm Composer 二.设置步骤 (一)下载 Code Sniffer 主要使用 P ...
- ORACLE基本知识
一.数据库名 什么是数据库名? 数据库名就是一个数据库的标识,就像人的身份证号一样.他用参数DB_NAME表示,如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名.在数据库安装或创建完成 ...
- 控制反转容器& 依赖注入模式 ---读感。
几个web框架 : sprint Avalon PicoContainerclass MovieLister MovieFinder finder = ServiceLocator.movieFind ...
- [leetcode 34] search for a range
1 题目: Given a sorted array of integers, find the starting and ending position of a given target valu ...
- AngularJs学习的前景及优势
一.趋势 互联网未来的发展趋势是前端后端只靠json数据来进行通信.后端只处理和发送一段json数据到前端,然后计算和模板渲染都在前端进行,而前端的改动,形成json数据然后传回到后端.未来趋势就是: ...
- HTML5优秀图表控件
不管是哪个领域的开发,都有机会用到图表来做统计分析,以更直观的表现形式来代替传统的文字.在以前,图表控件主要有使用程序代码生成的静态图片,或者是使用flash实现的图表控件. 在HTML5非常流行的当 ...