Asp.Net教程,WinForm教程,Asp.Net MVC,vs2008教程,vs2010教程,Silverlight技术,源码下载,Asp.Net视频教程
全站热门标签
vs2010 Silverlight 存储过程 水晶报表 LINQ ADO.NET JavaScript DataGridView GridView AjaxPro DevExpress 面向对象 Extjs XML HTML教程 Oracle jQuery WPF MVC 分页 Office2010 GDI+ Visual C++2010 Dojo MySQL VB.NET WCF4.0 ASPxGridView WinForm textbox Sql2005 cookie Discuz!NT checkbox WCF SQL经典语句 T-SQL F# asp.net VS2008 SQL Ajax DropDownList VS2008新特性 TreeView Access Flex 页面执行时间 字符串 DataSet VB2005 回调 动画 C#时间 游戏 ASP.NET MVC
当前位置: 主页 > Mvc技术 >

Asp.Net MVC实践 - 探索UrlRouting并分析UrlHelper (基于ASP.NET MVC Preview 3)(2)

时间:2010-08-18 21:10来源:未知 作者:admin 点击:

我们再看这两个方法,照样反编译下,具体代码如下:


public VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
    requestContext = this.GetRequestContext(requestContext);
    using (this.GetReadLock())
    {
        using (IEnumerator<RouteBase> enumerator = base.GetEnumerator())
        {
            while (enumerator.MoveNext())
            {
                VirtualPathData virtualPath = enumerator.get_Current().GetVirtualPath(requestContext, values);
                if (virtualPath != null)
                {
                    virtualPath.VirtualPath = GetUrlWithApplicationPath(requestContext, virtualPath.VirtualPath);
                    return virtualPath;
                }
            }
        }
    }
    return null;
}

public VirtualPathData GetVirtualPath(RequestContext requestContext, string name, RouteValueDictionary values)
{
    RouteBase base2;
    bool flag;
    requestContext = this.GetRequestContext(requestContext);
    if (string.IsNullOrEmpty(name))
    {
        return this.GetVirtualPath(requestContext, values);
    }
    using (this.GetReadLock())
    {
        flag = this._namedMap.TryGetValue(name, ref base2);
    }
    if (!flag)
    {
        throw new ArgumentException(string.Format(CultureInfo.CurrentUICulture, RoutingResources.RouteCollection_NameNotFound, new object[] { name }), "name");
    }
    VirtualPathData virtualPath = base2.GetVirtualPath(requestContext, values);
    if (virtualPath == null)
    {
        return null;
    }
    virtualPath.VirtualPath = GetUrlWithApplicationPath(requestContext, virtualPath.VirtualPath);
    return virtualPath;
}

 

 

第一个方法,由于没有提供name,于是遍历自身容器查询,第二个方法,如果提供的name不为空,则直接使用_namedMap获取,这是一个字典结构,如果没找到,则抛出异常.到这儿我们可以发现一个问题了,在没有提供routeName的情况下是遍历查询,只要找到满足条件的就返回了,那么如果有多可匹配的情况会如何呢?由于算法的特性,必然会返回第一个找到的结果,到这儿便焕然大悟了.如果我们的route初始化这样写:

routes.MapRoute("default", "default.aspx", new { controller = "demo", action = "test" });

routes.MapRoute("testroute ", "demo/{action}", new { controller = "demo", action = "test" });

那么我们用Url.Action(“demo”)的时候永远返回的是”default.aspx”,而不是可能需要的”demo/test”,于是在书写route规则的时候,必须做到从一般到特殊的规则,让系统从一般规则开始找,找不到再找特殊规则.当然,通过Url.RouteUrl便没有问题啦.因此,上面更规则的写法是:

routes.MapRoute("testroute", "demo/{action}", new { controller = "demo", action = "test" });

routes.MapRoute("default", "default.aspx", new { controller = "demo", action = "test" });

而对以这种定义:

Url.Action(“test”)和Url. RouteUrl(“testroute”)返回值将是一样的,都是”demo/test”.如果有参数,比如:

routes.MapRoute("testroute", "demo/{action}/{id}", new { controller = "demo", action = "test", id="1" });

routes.MapRoute("default", "default.aspx", new { controller = "demo", action = "test", id="0" });

则下面两种调用是等价的:

<%=Url.Action("test", new { id = "2" }) %>

<%=Url.RouteUrl("testroute", new { id = "2" })%>

都会输出:” demo/test/2”;同时由于这时不适用routename的查找也同时根据了action和id,因此上面的规则顺序改变下也不会出问题.

但是如果调用:

<%=Url.Action("test") %>

<%=Url.RouteUrl("testroute")%>

这时分别返回的是:

/default.aspx
/demo

这时想想上面的代码,自然可以理解原因了.
修改一下,刚才忘记继续分析UrlHelper.Content方法了,这个方法是用来处理路径的,由于使用UrlRouting,image等资源文件的引用路径就没有以前那么直接了,因此,框架提供了一个Content方法来转换,比如引用css,可以
 

Tags:ASP.NET MVC MVC asp.net
责任编辑:admin
返回顶部
------分隔线----------------------------
推荐内容
骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价 骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价