1

問:MVC URL路由,路由到錯誤的路由,爲什麼?

這是我的RegisterRoutes:

public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 


      routes.Add("ImagesRoute", new Route("graphics/{*filename}", new HttpRuntime.Routing.ImageRouteHandler())); 


      // insert_dateti 
      routes.MapRoute(
       "Default", // Routenname 
       "{controller}/{action}/{id}", // URL mit Parametern 
       new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameterstandardwerte 
       //new { controller = "Home", action = "Splash", id = UrlParameter.Optional } // Parameterstandardwerte 
       //new { controller = "Folders", action = "Content", id = UrlParameter.Optional } // Parameterstandardwerte 
      ); 



     } // End Sub RegisterRoutes 

這是我的路由處理

using System; 
using System.IO; 
using System.Web; 
using System.Linq; 
using System.Web.UI; 
using System.Web.Routing; 
using System.Web.Compilation; 
using System.Collections.Generic; 


namespace HttpRuntime.Routing 
{ 


    public class ImageRouteHandler : IRouteHandler 
    { 


     public string MapRemoteLocation(string strPath) 
     { 
      if (string.IsNullOrEmpty(strPath)) 
       return ""; 

      string strBaseURL = "http://madskristensen.net/themes/standard/"; 
      return strBaseURL + strPath; 
     } 

     public IHttpHandler GetHttpHandler(RequestContext requestContext) 
     { 


      string filename = requestContext.RouteData.Values["filename"] as string; 

      if (string.IsNullOrEmpty(filename)) 
      { 
       // return a 404 HttpHandler here 
       requestContext.HttpContext.Response.StatusCode = 404; 
       requestContext.HttpContext.Response.End(); 
       return null; 
      } // End if (string.IsNullOrEmpty(filename)) 
      else 
      { 
       requestContext.HttpContext.Response.Clear(); 
       requestContext.HttpContext.Response.ContentType = GetContentType(filename); 
       requestContext.HttpContext.Response.Redirect(MapRemoteLocation(filename)); 


       // find physical path to image here. 
       //string filepath = requestContext.HttpContext.Server.MapPath("~/test.jpg"); 


       // string stPath = requestContext.HttpContext.Request.Url.AbsolutePath; 
       //requestContext.HttpContext.Response.WriteFile(filepath); 
       //requestContext.HttpContext.Response.End(); 
      } // End Else of if (string.IsNullOrEmpty(filename)) 

      return null; 
     } // End Function GetHttpHandler 


     public static void MsgBox(object obj) 
     { 
      if (obj != null) 
       System.Windows.Forms.MessageBox.Show(obj.ToString()); 
      else 
       System.Windows.Forms.MessageBox.Show("obj is NULL"); 
     } // End Sub MsgBox 


     private static string GetContentType(String path) 
     { 
      switch (Path.GetExtension(path)) 
      { 
       case ".bmp": return "Image/bmp"; 
       case ".gif": return "Image/gif"; 
       case ".jpg": return "Image/jpeg"; 
       case ".png": return "Image/png"; 
       default: break; 
      } // End switch (Path.GetExtension(path)) 
      return ""; 
     } // End Function GetContentType 


    } // End Class ImageRouteHandler : IRouteHandler 


} // End Namespace HttpRuntime.Routing 

這樣做的目的是,當我有這個在/ home /指數。 cshtml

<img src="graphics/mads2011.png?v=123" title="Compose E-Mail" alt="Compose E-Mail" /> 

它從遠程主機下載圖片。

它正常工作,只要我有

routes.Add("ImagesRoute", new Route("graphics/{filename}", new HttpRuntime.Routing.ImageRouteHandler())); 

但是,當我爲了讓子文件夾將其更改爲

routes.Add("ImagesRoute", new Route("graphics/{*filename}", new HttpRuntime.Routing.ImageRouteHandler())); 

,然後重定向每個URL動作/圖形。

例如當我在主頁/ Index.cshtml有

$(function() { 
     $("#divJsTreeDemo").jstree({ 
     "json_data" : { 
      "ajax" : { 
       "url": "@Url.Action("GetNodesJson", "Home")" 
       //"url": "@Url.Action("GetTreeData", "Home")" 
       ,"async" : true 

爲生成的HTML頁面上的AJAX調用的URL變得

"url": "/graphics?action=GetNodesJson&amp;controller=Home" 

這是爲什麼? 我該如何解決這個問題? 如果我將我的ImagesRoute移動到底部,JavaScript正確路由,但是我不能獲得更多的遠程圖像,因爲它們被路由到控制器「圖形」,它不存在 - > Exception no such view ...

+1

我絕對喜歡aspnetmvc ...我絕對討厭路由。我感到你的痛苦。對不起,我無法幫忙。 – Jamiec

+0

哦,有一個可能的幫助是我在使用來自http://mvccontrib.codeplex.com/的路由調試器時遇到路由問題。 – Jamiec

回答

2

當建立從路線鏈接,您ImagesRoute使用{*filename}將滿足所有條件,使路線將始終被用來建立聯繫,如果它先於你的路由表的Default路線。但是,處理請求時,它會按預期工作,因爲ImagesRoute路由只能通過開始的請求來滿足http://mysite.com/graphics/...

爲了解決此問題,您需要將默認路由下面的ImagesRoutes移動,然後您需要添加將RouteConstraint設置爲默認路由,以便以graphics開頭的任何請求都將使默認路由失敗。

更改默認路線如下:

routes.MapRoute(
    "Default", // Routenname 
    "{controller}/{action}/{id}", // URL mit Parametern 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // defaults 
    new { controller = @"^(?!graphics).+" } // constraint 
); 
+0

太棒了,作品!非常感謝你 !雖然我必須說我仍然不明白爲什麼@ Url.Action(「GetNodesJson」,「Home」)「/ Home/GetNodesJson滿足/ graphics/whatever。或者爲什麼@ Url.Action(」ActionName「,」 ControllerName「)變成了圖形/控制器名稱/ ActionName。不知何故,它只是填充到route1的擴展route2 ...我想我必須閱讀MVC的來源才能理解路由部分。 –

+0

因爲你的ImagesRoute URL參數由單個貪婪匹配組成,它匹配由MVC構建的任何鏈接。在鏈接建設方面,一切都與該路線相匹配。請標記爲已回答。謝謝。 – counsellorben