Direccionamiento de parámetros opcionales en ASP.NET MVC 5

Estoy creando una aplicación ASP.NET MVC 5 y tengo algunos problemas con el enrutamiento. Estamos utilizando el atributo Route para mapear nuestras rutas en la aplicación web. Tengo la siguiente acción:

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

Solo podemos acceder a esta URL si pasamos la barra diagonal / al final de url , como esto:

 type/lib/version/file/cache/ 

Funciona bien pero no funciona sin / , recibo un error 404 no encontrado, como este

 type/lib/version/file/cache 

o esto (sin parámetros opcionales):

 type/lib/version 

Me gustaría acceder con o sin / char al final de url . Mis dos últimos parámetros son opcionales.

Mi RouteConfig.cs es así:

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

¿Cómo puedo resolverlo? ¿Hacer la barra / ser opcional también?

¿Tal vez deberías intentar tener tus enumeraciones como enteros?

Así es como lo hice.

 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"); } } 

Y mi archivo de enrutamiento

 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 }); } 

Entonces puedo hacer llamadas como

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

o

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

y funciona bien …

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