0

デフォルトの asp.net mvc ルートが 2 つあるという問題に直面しています (カスタム制約によって適用されます)。私がやろうとしているのは、パラメーターが routedictionary で提供されているかどうかに基づいて、さまざまなビューをロードすることです。以下は私の2つのルートですRouteConfig.cs

        routes.MapRoute(
            name: "DefaultWatch",
            url: "{controller}/{action}/{title}",
            defaults: new { controller = "Watch", action = "Index", title = ""},
            constraints: new { title = new VideoTypeRouteConstraint() }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}",
            defaults: new { controller = "Main", action = "Index"}
        );

タイトル文字列が指定されている場合に開く/watch/Index/{title}か、デフォルトのルートを開くだけです/Main/Index。以下は、ルート制約の実装です。

VideoTypeRouteConstraint.cs

public class VideoTypeRouteConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        if (values.ContainsKey(parameterName))
        {
            string value = values[parameterName].ToString();
            return !String.IsNullOrEmpty(value) ? true : false;
        }
        return false;
    }
}

私がやろうとしているRouteValueDictionaryのは、タイトル変数が含まれているかどうかを確認し、含まれている場合は true を返すので、/Watch/Index/{title}実行されます。

以下のURLにアクセスすると機能するようになりました

http://localhost:53923/    //returns /Main/Index correctly
http://localhost:53923/?title=routing-optional-parameters-in-asp-net-mvc-5  //Also returns /Main/Index because the value in RouteValueDictionary is null but I can see the value in httpContext.Request[parameterName]

http://localhost:53923/routing-optional-parameters-in-asp-net-mvc-5  //this DOES NOT WORK - Returns 404

RouteValueDictionaryキー (タイトル) が含まれていますが、その値は常に null です。これが問題だと私が信じているところですが、私はそれを特定できません。

これの全体的なアイデアはSEO、別のコントローラーを使用したときにはるかに長い URL をきれいにすることでした。

4

0 に答える 0