mvc のデータベースに保存されている URL に基づいて、カスタム ルーティング ロジックを追加しようとしています。(CMSのように)かなり基本的なことだと思いますが、実際にはどこにも到達していないように感じます。
基本的に、ユーザーは次のような URL を入力できます。
www.somesite.com/categorya/categoryb/categoryf/someitem
www.somesite.com/about/someinfo
データベースには、これらのアイテムがタイプ (通常のページまたは製品ページ) とともに保存されます。
これに応じて、実際に別の「アクション」メソッドをヒットしたい、つまり、上記のメソッドをヒットしたい:
PageController/Product
PageController/Normal
これらのアクションは、このページのコンテンツをロードし、同じビュー (製品ビューまたは通常のビュー) を表示します。
通常のルーティング方法を使用してもうまくいきません。
cata/producta
cata/catb/catc/catd/cate/catf/producta
今、私はここを見てきました:検索のための ASP.NET MVC カスタム ルーティング
これをベースとして使用しようとしていますが、InvokeActionMethod 呼び出し内でヒットしたいアクション メソッドを実際に「変更」するにはどうすればよいですか?
ところでMVC 3.0を使用しています。
ヘルプ/提案をありがとう
最終的解決:
Global.asax
routes.MapRoute(
"Default",
"{*path}",
new { controller = "Page", action = "NotFound", path= "Home" }
).RouteHandler = new ApplicationRouteHandler();
ルート ハンドラ
public class ApplicationRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new ApplicationHandler(requestContext);
}
}
public class ApplicationHandler : MvcHandler, IRequiresSessionState
{
public ApplicationHandler(RequestContext requestContext)
: base(requestContext)
{
}
protected override IAsyncResult BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, object state)
{
var url = RequestContext.RouteData.Values["path"].ToString();
var page = SomePageService.GetPageByUrl(url);
if (page == null)
{
RequestContext.RouteData.Values["Action"] = "NotFound";
}
else
{
RequestContext.RouteData.Values["Action"] = page.Action;
RequestContext.RouteData.Values["page"] = page;
}
return base.BeginProcessRequest(httpContext, callback, state);
}
}