web-dev-qa-db-ja.com

ASP.NET MVC 5のルーティングオプションパラメータ

ASP.NET MVC 5アプリケーションを作成していますが、ルーティングに問題があります。属性Routeを使用して、Webアプリケーションでルートをマップしています。次のアクションがあります。

[Route("{type}/{library}/{version}/{file?}/{renew?}")]
public ActionResult Index(EFileType type, 
                          string library, 
                          string version, 
                          string file = null, 
                          ECacheType renew = ECacheType.cache)
{
 // code...
}

このURLにアクセスできるのは、次のようにurlの最後にスラッシュ文字/を渡す場合のみです。

type/lib/version/file/cache/

正常に動作しますが、/なしでは動作しません。このように404 not foundエラーが表示されます

type/lib/version/file/cache

またはこれ(オプションのパラメーターなし):

type/lib/version

urlの末尾にある/ charの有無にかかわらずアクセスしたいです。最後の2つのパラメーターはオプションです。

私のRouteConfig.csは次のようなものです。

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

        routes.MapMvcAttributeRoutes();
    }
}

どうすれば解決できますか?スラッシュ/もオプションにしますか?

26
Felipe Oriani

代わりに、整数として列挙型を使用する必要がありますか?

これは私がやった方法です

public enum ECacheType
{
    cache=1, none=2
}

public enum EFileType 
{
    t1=1, t2=2
}

public class TestController
{
    [Route("{type}/{library}/{version}/{file?}/{renew?}")]
    public ActionResult Index2(EFileType type,
                              string library,
                              string version,
                              string file = null,
                              ECacheType renew = ECacheType.cache)
    {
        return View("Index");
    }
}

そして、私のルーティングファイル

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

    // To enable route attribute in controllers
    routes.MapMvcAttributeRoutes();

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

その後、次のように電話をかけることができます

http://localhost:52392/2/lib1/ver1/file1/1
http://localhost:52392/2/lib1/ver1/file1
http://localhost:52392/2/lib1/ver1

または

http://localhost:52392/2/lib1/ver1/file1/1/
http://localhost:52392/2/lib1/ver1/file1/
http://localhost:52392/2/lib1/ver1/

そしてそれはうまく動作します...

31
Ohlin