1

次のルーティング ルールを明示的に接続せずに解決するにはどうすればよいですか?

次のように、プロモーションの理由でわかりやすい URL を追加したいと思います。

domain.com/promoA
domain.com/promoB

これらは、単一の「プロモーション」コントローラーで処理する必要があります。(これが「ホーム」コントローラーによって処理されてもかまいません)

次に、次の形式の URL をコントローラーに直接マップしたいと思います

domain.com/account       ---> controller=account, action=index
domain.com/account/login ---> controller=account, action=login
domain.com/product/list  ---> controller=product, action=list
domain.com               ---> controller=home, action=index

出来ますか?

ありがとう!

4

2 に答える 2

1

これが最も簡単な方法かどうかはわかりませんが、制約付きのルートを設定することはできます。他のルートの前に宣言するようにしてください。

routes.MapRoute(
    "Promos", // Route name
    "{action}", // URL with parameters
    new { controller = "Promotions", }, // Parameter defaults
    new { action = new PromoConstraint(), }
);

PromoConstraintが次のように定義されている場合

public class PromoConstraint : IRouteConstraint
{
    private readonly List<string> _promos = new List<string> { "promoA", "promoB", }; 

    public bool Match(
        HttpContextBase httpContext
        , Route route
        , string parameterName
        , RouteValueDictionary values
        , RouteDirection routeDirection
    )   {
        object value;
        if(!values.TryGetValue(parameterName, out value)) return false;

        var str = value as string;
        if(str == null) return false;

        return _promos.Any(promo => promo.ToLower() == str.ToLower());
    }
}
于 2013-03-09T14:47:35.893 に答える
0

はい、可能です。

必要な作業は、Home コントローラー チェックの Index アクション メソッドを使用して、指定された製品が製品テーブルに存在するかどうかを確認することだけです。そうであれば、その製品のビューを返します。それ以外の場合は、単にインデックス ビューを返します。

質問で説明したように、他のすべてのコントローラーのルートを設定する必要があります。

また、ルートルートは、オプションの「製品」パラメーターを取ることを指定する必要があります。

routes.MapRoute("Root",   "{product}",   new { controller = "Home", action = "Index", product = "" });

それらが特定のパターンに従う場合、正規表現を使用して制約を追加することで、これらのプロモーションを処理する新しいルートを追加できます。

于 2013-03-08T18:48:07.433 に答える