ASP.NET MVCサイトのキャッチオールルートを定義するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/218845

  •  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() }
);

そのようにして、他の定義されたルートに干渉しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top