J'aimerais que des tirets séparent les mots dans mes URL. Ainsi, au lieu de :
/MyController/MyAction
J'aimerais bien :
/My-Controller/My-Action
Est-ce possible ?
J'aimerais que des tirets séparent les mots dans mes URL. Ainsi, au lieu de :
/MyController/MyAction
J'aimerais bien :
/My-Controller/My-Action
Est-ce possible ?
Vous pouvez utiliser l'attribut ActionName comme suit :
[ActionName("My-Action")]
public ActionResult MyAction() {
return View();
}
Notez que vous devrez ensuite appeler votre fichier View "Mon-Action.cshtml" (ou l'extension appropriée). Vous devrez également faire référence à "mon-action" dans toutes les méthodes Html.ActionLink.
Il n'y a pas de solution aussi simple pour les contrôleurs.
Activez les routes globalement :
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapMvcAttributeRoutes();
// routes.MapRoute...
}
Maintenant avec MVC5, le routage des attributs a été absorbé dans le projet. Vous pouvez maintenant utiliser :
[Route("My-Action")]
Sur les méthodes d'action.
Pour les contrôleurs, vous pouvez appliquer un RoutePrefix
qui sera appliqué à toutes les méthodes d'action de ce contrôleur :
[RoutePrefix("my-controller")]
L'un des avantages de l'utilisation RoutePrefix
Les paramètres de l'URL seront également transmis aux méthodes d'action.
[RoutePrefix("clients/{clientId:int}")]
public class ClientsController : Controller .....
Snip
[Route("edit-client")]
public ActionResult Edit(int clientId) // will match /clients/123/edit-client
Bon conseil. Juste pour ajouter : Lorsque vous faites cela avec l'invocation View() par défaut, MVC cherchera "Mon-Action.aspx" quelque part dans le dossier Views, et non "MonAction.aspx", à moins que vous ne spécifiez explicitement le nom d'origine.
@Eduardo Je pense que l'attribut ActionName a été ajouté pour la Preview 5, qui est sortie juste après le post de Phil.
Vous pouvez créer un gestionnaire de route personnalisé comme indiqué dans ce blog :
http://blog.didsburydesign.com/2010/02/how-to-allow-hyphens-in-urls-using-asp-net-mvc-2/
public class HyphenatedRouteHandler : MvcRouteHandler{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
return base.GetHttpHandler(requestContext);
}
}
...et la nouvelle route :
routes.Add(
new Route("{controller}/{action}/{id}",
new RouteValueDictionary(
new { controller = "Default", action = "Index", id = "" }),
new HyphenatedRouteHandler())
);
Une question très similaire a été posée ici : Prise en charge par ASP.net MVC des URL contenant des tirets
J'ai développé une source ouverte Bibliothèque NuGet pour ce problème qui convertit implicitement EveryMvc/Url en every-mvc/url.
Les urls en majuscules posent problème car les chemins des cookies sont sensibles à la casse. La plupart des sites Internet sont en fait sensibles à la casse, alors que les technologies Microsoft traitent les urls comme insensibles à la casse. ( Plus d'informations sur mon blog )
Paquet NuGet : https://www.nuget.org/packages/LowercaseDashedRoute/
Pour l'installer, il suffit d'ouvrir la fenêtre NuGet dans Visual Studio en faisant un clic droit sur le projet et en sélectionnant NuGet Package Manager, et dans l'onglet "Online", tapez "Lowercase Dashed Route", et il devrait apparaître.
Alternativement, vous pouvez exécuter ce code dans la console du gestionnaire de paquets :
Install-Package LowercaseDashedRoute
Après cela, vous devez ouvrir App_Start/RouteConfig.cs et commenter l'appel route.MapRoute(...) existant et ajouter ceci à la place :
routes.Add(new LowercaseDashedRoute("{controller}/{action}/{id}",
new RouteValueDictionary(
new { controller = "Home", action = "Index", id = UrlParameter.Optional }),
new DashedRouteHandler()
)
);
C'est ça. Toutes les urls sont en minuscules, en pointillés, et converties implicitement sans que vous fassiez quoi que ce soit de plus.
Url du projet Open Source : https://github.com/AtaS/lowercase-dashed-route
Vous pouvez écrire une route personnalisée qui dérive de la classe Route GetRouteData pour supprimer les tirets, mais lorsque vous appelez les API pour générer une URL, vous devez vous souvenir d'inclure les tirets pour le nom de l'action et le nom du contrôleur.
Ça ne devrait pas être trop difficile.
Phil a raison (comme d'habitude). Il existe un excellent exemple dont je ne peux pas m'attribuer le mérite, mais que je suis reconnaissant d'avoir trouvé. Il est écrit par un MVP et vous pouvez le trouver à l'adresse suivante aquí .
Voici mon paquet NuGet pour cette implémentation : nuget.org/packages/LowercaseDashedRoute N'oubliez pas de lire le README sur GitHub (via le lien Project Info sur la page NuGet).
Vous pouvez définir un itinéraire spécifique tel que :
routes.MapRoute(
"TandC", // Route controllerName
"CommonPath/{controller}/Terms-and-Conditions", // URL with parameters
new {
controller = "Home",
action = "Terms_and_Conditions"
} // Parameter defaults
);
Mais cette route doit être enregistrée AVANT votre route par défaut.
De même, en utilisant AttributRouting vous permet de spécifier n'importe quel nom de route, avec l'avantage supplémentaire de savoir exactement à quelle route votre action est associée.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Duplicata possible de Prise en charge par ASP.net MVC des URL contenant des tirets
2 votes
@John la question que vous avez liée est un duplicata possible, pas celle-ci, voyez les dates, cette question est posée environ 2 ans plus tard que celle-ci.