Дополнительные параметры маршрутизации в ASP.NET MVC 5

Я создаю приложение ASP.NET MVC 5, и у меня есть некоторые проблемы с маршрутизацией. Мы используем атрибут Route для сопоставления наших маршрутов в веб-приложении. У меня есть следующее действие:

[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 мы передаем слэш char /, например:

type/lib/version/file/cache/

Он отлично работает, но не работает без /, я получаю 404 не найденную ошибку, например

type/lib/version/file/cache

или это (без дополнительных параметров):

type/lib/version

Я хотел бы получить доступ с / char или без него в конце url. Мои последние последние параметры являются необязательными.

Мой RouteConfig.cs выглядит следующим образом:

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

        routes.MapMvcAttributeRoutes();
    }
}

Как я могу это решить? Сделать косую черту / необязательной?

Ответы

Ответ 1

Может быть, вы должны попытаться использовать свои перечисления как целые числа?

Вот как я это сделал

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/

и он отлично работает...

Ответ 2

//its working with mvc5
[Route("Projects/{Id}/{Title}")]
public ActionResult Index(long Id, string Title)
{
    return view();
}