ASP.Net MVC ルート マッピング
-
08-06-2019 - |
質問
私は MVC (および ASP.Net ルーティング) を初めて使用します。地図を作成しようとしています *.aspx
というコントローラに PageController
.
routes.MapRoute(
"Page",
"{name}.aspx",
new { controller = "Page", action = "Index", id = "" }
);
上記のコードは *.aspx を次のようにマッピングするのではないでしょうか? PageController
?これを実行して .aspx ページを入力すると、次のエラーが発生します。
パス '/Page.aspx' のコントローラーが見つからないか、IController インターフェイスが実装されていません。パラメータ名:コントローラの種類
ここで私がやっていないことはありますか?
解決
私は自分自身の質問に答えただけです。ルートが後方にありました(デフォルトはページ上にありました)。
はい、すべてのカスタム ルートをデフォルト ルートの上に配置する必要があります。
そこで次の疑問が生じます...「デフォルト」ルートは、「ページ」ルートとどのように一致しますか?
デフォルト ルートは、いわゆる「設定よりも規約」に基づいて一致します。Scott Guthrie は、ASP.NET MVC に関する最初のブログ投稿でそれについて詳しく説明しています。この本と彼の他の投稿を一読することをお勧めします。これらは最初の CTP に基づいて投稿されており、フレームワークは変更されていることに注意してください。Scott Hanselman の asp.net サイトでは、ASP.NET MVC の Web キャストを見つけることもできます。
他のヒント
私は自分自身の質問に答えただけです。ルートを逆にしました(デフォルトはページの上にありました)。以下が正しい順序です。そこで次の疑問が生じます...「デフォルト」ルートは(ここでは正規表現を使用していると思います)「ページ」ルートとどのように一致しますか?
routes.MapRoute(
"Page",
"{Name}.aspx",
new { controller = "Page", action = "Display", id = "" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
Rob Conery の MVC ストアフロントの 1 つ スクリーンキャスト, 、彼はまさにこの問題に遭遇しました。興味のある方は23分あたりからご覧ください。
コントローラーがどのように表示されているかわかりませんが、エラーはコントローラーが見つからないことを示しているようです。PageController クラスを作成した後、Controller を継承しましたか?PageController は、Controllers ディレクトリにありますか?
Global.asax.cs の私のルートは次のとおりです。
routes.MapRoute(
"Page",
"{Page}.aspx",
new { controller = "Page", action = "Index", id = "" }
);
これが私のコントローラーです。コントローラーフォルダーにあります。
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class PageController : Controller
{
public void Index()
{
Response.Write("Page.aspx content.");
}
}
}
public class AspxRouteConstraint : IRouteConstraint
{
#region IRouteConstraint Members
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
return values["aspx"].ToString().EndsWith(".aspx");
}
#endregion
}
すべての aspx のルートを登録します
routes.MapRoute("all",
"{*aspx}",//catch all url
new { Controller = "Page", Action = "index" },
new AspxRouteConstraint() //return true when the url is end with ".aspx"
);
そして、次のようにしてルートをテストできます MvcRouteVisualizer