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