1

質問:MVC URLルーティング、間違ったルートへのルーティング、なぜですか?

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 

です:

これが私のRegisterRoutesです。 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が正常にルーティングされますが、コントローラーの "グラフィックス"にルーティングされるため、リモートイメージは表示されません。

+1

を私は絶対にaspnetmvcを愛する...私は絶対にルーティングを憎みます。あなたの痛みが分かります。申し訳ありませんが私は助けます。 – Jamiec

+0

ああ、可能な助けの1つは、ルーティングの問題があるときにhttp://mvccontrib.codeplex.com/からルートデバッガを使用することです。 – Jamiec

答えて

2

ルートからのリンクを作成する場合、ルートは常に、それはあなたのルーティングテーブルにあなたのDefaultルートの前にあれば、リンクを構築するために使用されるように、{*filename}を使用してImagesRouteは、すべての条件を満たします。要求を処理するときImagesRouteルートのみがこの問題を解決するためにhttp://mysite.com/graphics/...

を開始する要求によって満足されるためただし、期待どおりに動作しますが、あなたは、デフォルトルート下のImagesRoutesを移動する必要がある、とあなたがして追加する必要がありますa 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

素晴らしい作品です!どうもありがとうございました !なぜなら、@ Home.Action( "GetNodesJson"、 "Home") "/ Home/GetNodesJsonが/ graphics/whateverを満たすかどうか、またなぜ@ Url.Action(" ActionName "、"どうやら、それはちょうどroute1に拡大されたroute2を塗りつぶす...私は、ルーティング部分を理解するためにMVCのソースを読む必要があると思います。 –

+0

あなたのImagesRoute URLパラメータは1つの貪欲な一致で構成され、MVCによって構築されるすべてのリンクに一致します。リンクビルディング側では、すべてがそのルートに一致します。回答としてマークしてください。ありがとう。 – counsellorben