route parameter net mvc attribute asp c# asp.net asp.net-mvc routing asp.net-mvc-5

c# - parameter - Direccionamiento de parámetros opcionales en ASP.NET MVC 5



asp.net mvc route attribute (2)

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 / , obtengo 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(); }