Je crée une application ASP.NET MVC 5 et j'ai des problèmes de routage. Nous utilisons l'attribut Route
pour mapper nos itinéraires dans l'application Web. J'ai l'action suivante:
[Route("{type}/{library}/{version}/{file?}/{renew?}")]
public ActionResult Index(EFileType type,
string library,
string version,
string file = null,
ECacheType renew = ECacheType.cache)
{
// code...
}
Nous ne pouvons accéder à cette URL que si nous transmettons le caractère de barre oblique /
à la fin de url
, comme ceci:
type/lib/version/file/cache/
Cela fonctionne bien mais ne fonctionne pas sans /
, J'ai un 404
erreur non trouvée, comme celle-ci
type/lib/version/file/cache
ou ceci (sans paramètres optionnels):
type/lib/version
Je souhaite accéder avec ou sans /
char à la fin de url
. Mes deux derniers paramètres sont facultatifs.
Ma RouteConfig.cs
est comme ça:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
}
}
Comment puis-je le résoudre? Faites la barre oblique /
être facultatif aussi?
Peut-être devriez-vous plutôt essayer d'avoir vos énumérations sous forme d'entiers?
C'est comme ça que je l'ai fait
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");
}
}
Et mon fichier de routage
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 });
}
Je peux alors faire des appels comme
http://localhost:52392/2/lib1/ver1/file1/1
http://localhost:52392/2/lib1/ver1/file1
http://localhost:52392/2/lib1/ver1
ou
http://localhost:52392/2/lib1/ver1/file1/1/
http://localhost:52392/2/lib1/ver1/file1/
http://localhost:52392/2/lib1/ver1/
et ça marche bien ...