ASP.NET MVC路由扩展:链接和URL的生成(5)
来源:未知 责任编辑:责任编辑 发表时间:2014-02-02 17:48 点击:次
46: string virtualPath = this.RouteCollection.GetVirtualPath(this.RequestContext, routeValues).VirtualPath;
47: if (string.IsNullOrEmpty(protocol) && string.IsNullOrEmpty(hostName))
48: {
49: return virtualPath.ToLower();
50: }
51:
52: protocol = protocol??"http";
53: Uri uri = this.RequestContext.HttpContext.Request.Url;
54: hostName = hostName ?? uri.Host + ":" + uri.Port;
55: return string.Format("{0}://{1}{2}", protocol, hostName, virtualPath).ToLower();
56: }
57: }
RouteHelper具有与UriHelper完全一致的Action方法重载定义,而URL的生成最终体现在最后一个Action重载中。具体的逻辑很简单,如果指定的Controller名称为Null,我们通过RequestContext获取出当前Controller名称,然后将Action和Controller名称添加到表示路由变量 列表的RouteValueDictionary对象中(routeValues参数),对应的Key分别是“action”和“controller”。
然后我们调用RouteCollection的GetVirtualPath得到一个VirtualPathData对象。如果既没有显示指定传输协议名称也没有指定主机名称,直接返回VirtualPathData的VirtualPath体现的相对路径,否则生成一个完整的URL。如果没有指定主机名称,我们采用当前请求的主机名称,并且使用当前的端口;如果没有指定传输协议,则直接使用“http”。
接下来我们在添加的Global.asax中通过如下的代码注册一个URL模板为"{controller}/{action}/{id}”的路由对象。
1: public class Global : System.Web.HttpApplication
2: {
3: protected void Application_Start(object sender, EventArgs e)
4: {
5: RouteTable.Routes.MapRoute("default", "{controller}/{action}/{id}");
6: }
7: }
在添加的Web页面(Default.aspx)中我们通过如下的代码利用我们自定义的RouteHelper生成三个URL。在页面加载事件处理方法中,我们根据手工创建的HttpRequest和HttpResponse创建一个HttpContext对象,并进一步创建HttpContextWrapper对象。然后我们手工创建一个RouteData对象,并针对上面定义的URL模板添加了三个变量元素(controller=home;action=index;id=002),它们实际上和我们创建的HttpRequest的URL是一一匹配的。最后针对创建的HttpContextWrapper对象和RouteData进一步创建RequestContext对象,并最终创建出RouteHelper对象。
1: public partial class Default : System.Web.UI.Page
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>