0

とにかく、1つの同じRouteBaseで2つのtry-allパラメーターを使用できることはありますか?

すなわち:私は現在、S3からメディアファイルを取得するカスタマイズされたルートであるルート: "media /{*key}"を持っています

SEOの目的で:上記と同じS3リソースを指すが、最後に名前が追加された別のルート「media / {* key} /{*name}」を設定する必要があります

現在、ルーティングを処理する際にカスタマイズされた「StorageServiceRoute」を作成しました。

でも

var innerRoute = new Route(_routeUrl, this);

_routURL( "media / {* key} / {* name}")で2回のtry-catchを実行できません。また、次のようなエラーが発生します。

キャッチオールパラメータは、ルートURLの最後のセグメントとしてのみ表示できます。

ルーティングでこれを処理する良い方法はありますか?前もって感謝します!

4

2 に答える 2

0

ルート定義に問題があります

ルートURL定義には、1つのキャッチオールパラメータがいつ終了し、次のパラメータが開始するかという問題があります。

"media/{*key}/{*name}"

最初のものが任意の数のセグメントを持つことができる場合。2番目もそうです。ルート内に別の静的セグメントを含めることができる場合は、状況はより単純になります。つまり:

"media/{*key}/something/{*name}"

この場合、独自のカスタムルートを作成するか、私が作成したルートを使用することができます。あなたは私のブログ投稿ですべての詳細を見つけることができます。

于 2012-04-27T19:18:40.353 に答える
0

カスタムルートを書くことができます:

public class MediaRoute : Route
{
    public MediaRoute()
        : base(
            "media/{*catchall}",
            new RouteValueDictionary(new
            {
                controller = "Home",
                action = "Index"
            }),
            new MvcRouteHandler()
        )
    {
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var rd = base.GetRouteData(httpContext);
        if (rd == null)
        {
            return null;
        }

        var catchall = rd.GetRequiredString("catchall");
        var tokens = catchall.Split(new[] { '/' }, 2);
        if (tokens.Length > 0)
        {
            rd.Values["key"] = tokens[0];
        }
        if (tokens.Length > 1)
        {
            rd.Values["name"] = tokens[1];
        }

        return rd;
    }
}

に登録できますGlobal.asax

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.Add("media", new MediaRoute());

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}
于 2012-04-26T08:18:15.607 に答える