asp.net mvcの新機能(v3 + razorを使用)を使用して、データベースに基づいて動的ルートを作成する際の問題をどのように解決するのかが不思議です。基本的には、メインのサイトナビゲーションはデータベースに入力され、ルートとしてロードする必要があります。すなわち - 可能ならば、データベースからロードカテゴリリスト、そしてRouteHandler vs ControllerFactory
mysite.com/cars mysite.com/televisions mysite.com/computers
など
...ルーティングエンジンへのルートを追加...スラッシュの後の各カテゴリはdbから来ますが、/ aboutと/ contactusのようなデータベースにはなく、global.asaxに静的に入力されている通常のエントリがあります。 :
動的データベースのURLでは、カスタムRouteHandlerを使用する必要があります。データベースからロードされたエントリの要求に一致して処理するControllerFactoryを作成します。 RouteHandlerまたはCustomControllerFactoryがデータベースからのリスト内のルートを見つけられない場合、DefaultControllerFactoryにルーティングを処理させることは可能ですか?任意の助けてくれてありがとう、これと非常に最初のプロジェクトは、私は最善のルートが何であるかわからないんだけど。...何のしゃれが意図していない)
更新:
から引っ張るルート制約を使用してみました
Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Categories",
"{category}/{*values}",
new { controller = "Category", action = "List" },
new CategoryListConstraint()
);
Routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
:
public class CategoryListConstraint : IRouteConstraint
{
public CategoryListConstraint()
{
var repo = new Repository<Topic>();
var cats = repo.All();
var values = new List<string>();
foreach (var c in cats)
{
values.Add(c.URI.Replace("/", "").Replace("?", ""));
}
this._values = values.ToArray<string>();
}
private string[] _values;
public bool Match(HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection)
{
// Get the value called "parameterName" from the
// RouteValueDictionary called "value"
string value = values[parameterName].ToString();
// Return true is the list of allowed values contains
// this value.
return _values.Contains(value);
}
}
、ここでのルートです:データベースが、それはここに...今、デフォルトルートと競合するには、私のカスタム制約とルートがあります0
ホームページwww.mysite.comはDefaultルートを使用してロードします。制約リストに一致するすべてのURLはカテゴリルートによって読み込まれますが、www.mysite.com/adminまたはwww.mysite.com/aboutusを持っている場合は、これらの値はカテゴリルートによって選択されます制約リストのではなく、です。混乱しています...
注意しなければならないのは、通常のコントローラがデータベースの名前と一致しないことを確認することだけですが、私の場合は不可能です。 – bbqchickenrobot