|
我们再看这两个方法,照样反编译下,具体代码如下:
public VirtualPathData GetVirtualPath(RequestContext requestContext, string name, RouteValueDictionary values)
第一个方法,由于没有提供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 这时想想上面的代码,自然可以理解原因了. |





骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价