単一コントローラーサイトのASP.NET MVCルーティング
-
05-07-2019 - |
質問
単純なサイトを作成しようとしています。基本的に、1つのコントローラーHome
コントローラーがあります。
このコントローラーにはアクションがありますIndex
は引数としてstring
(ディレクトリ)を取り、その「ディレクトリ」を使用して作業を行います。
この1つのアクションにすべてのURLを送信する一般的なキャッチオールルートを作成する方法がわかりません。
任意のURLの組み合わせが存在する可能性があり、ドメイン名以外は文字列にする必要があります。
http://<domain>/2008
http://<domain>/2008/09
http://<domain>/2008/09/Fred
これを行う方法を知っている人はいますか?すべての値がリストとして渡されても大丈夫です。
これを行うより良い方法はありますか?
解決
これを試してください:
routes.MapRoute(
"Default", "{*path}",
new { controller = "Home", action = "Index" }
);
そしてコントローラー:
public class HomeController : Controller {
public ActionResult Index(string path) {
return View();
}
}
他のヒント
最初に考えたのは、それは「悪い考え」です。あなたがURLのためにあなたに投げかけることができる何かを取ることができるなら、あなたはブラックリスト(またはホワイトリスト)の束を持っていなければなりません。たくさんの開口部があります。より良い方法は、これらのルートとパラメーターの許可方法を明示的に記述し、それらの受け入れられたルートを処理するアクションを実行することです。これで、エラーページにリダイレクトされる汎用キャッチオールルートが得られます。
リンゴとオレンジを混ぜようとしているように感じます。 ASP.NET MVCは、意図的に「ページ」アイデアを廃止します。何らかのファイルI / Oを実行している場合を除き、さまざまなユーザー用のディレクトリを用意する理由は本当にありません。その場合は、ASP.NET MVCパラダイムで動作するように抽象化して、想像以上に簡単にできます。
ASP.NET MVCで、渡された文字列(渡された文字列と同様)に基づいて探している情報を変更したい場合、「安全な」方法があります:
方法#1-3つのルート、3つのアクション、異なる名前
routes.MapRoute(
"YearOnly",
"{year}",
new { controller = "Index", action = "ShowByYear" },
new { year = @"\d{4}" }
);
routes.MapRoute(
"YearAndMonth",
"{year}/{month}",
new { controller = "Index", action = "ShowByYearAndMonth" },
new { year = @"\d{4}", month = @"\d{2}" }
);
routes.MapRoute(
"YearMonthAndName",
"{year}/{month}/{name}",
new { controller = "Index", action = "ShowByYearMonthAndName" },
new { year = @"\d{4}", month = @"\d{2}" }
);
そして、コントローラーアクションで渡されたルート値を使用して、データの表示方法を決定します。
ShowByYear(string year)
{
//Return appropriate View here
}
ShowByYearAndMonth(string year, string month)
{
//Return appropriate View here
}
ShowByYearMonthAndName(string year, string month, string name)
{
//Return appropriate View here
}
方法#2-推奨される方法
routes.MapRoute(
"YearOnly",
"{year}",
new { controller = "Index", action = "Show" },
new { year = @"\d{4}" }
);
routes.MapRoute(
"YearAndMonth",
"{year}/{month}",
new { controller = "Index", action = "Show" },
new { year = @"\d{4}", month = @"\d{2}" }
);
routes.MapRoute(
"YearMonthAndName",
"{year}/{month}/{name}",
new { controller = "Index", action = "Show" },
new { year = @"\d{4}", month = @"\d{2}", name = "" }
);
Show(string year)
{
//
}
Show(string year, string month)
{
//Return appropriate View here
}
Show(string year, string month, string name)
{
//Return appropriate View here
}
このアプローチの利点は、MapRoute
がURL解析を処理することです。リフラフを排除します。その後、エラーをスローするだけのキャッチオールルートを設定できます。あなたのコントローラーではなく、ルート側でregex
を使って解析を行いたいと思います(私の意見では)。
これにより、3つのオーバーロードアクションに抑えられ、よりクリーンでより「MVC」的なコードが可能になります。