ASP.NET MVCサイトのキャッチオールルートを定義するにはどうすればよいですか?
-
03-07-2019 - |
質問
カテゴリでタグ付けされた記事のあるニュースサイトがあります。
私のコントローラーは" Category"と呼ばれます;このURL:
http://mysite.com/Category/Sport
コントローラー Category
のアクション Index
に Sport
を渡します。
次のURLを許可します:
http://mysite.com/Sport/Hockey
http://mysite.com/Sport/Football
http://mysite.com/Science/Evolution
すべてのカテゴリ情報をコントローラ Category
のアクション Index
に渡します。
これらすべてを処理し、カテゴリに移動するキャッチオールルートを作成するにはどうすればよいですか?
解決
これらの線に沿って私の質問にかなり良い応答がありますこちら。
他のヒント
次のようにできます:
routes.MapRoute("Default", "{category}/{subcategory}",
new { controller = "CategoryController", action = "Display", id = "" }
);
そしてコントローラーで:
public class CategoryController : Controller
{
public ActionResult Display(string category, string subcategory)
{
// do something here.
}
}
上記のルートをすべてのルートに使用しないでください(上記のルートの前に明示的なルートを指定しない限り、Aboutページなどを使用できません)。
ただし、ルートを既存のカテゴリのみに制限するカスタム制約を含めることができます。次のようなもの:
public class OnlyExistingCategoriesConstraint : IRouteConstraint
{
public bool Match
(
HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection
)
{
var category = route.DataTokens["category"];
//TODO: Look it up in your database etc
// fake that the category exists
return true;
}
}
ルートで次のように使用します:
routes.MapRoute("Default",
"{category}/{subcategory}",
new { controller = "CategoryController", action = "Display", id = "" },
new { categoryExists = new OnlyExistingCategoriesConstraint() }
);
そのようにして、他の定義されたルートに干渉しません。
所属していません StackOverflow