77 votes

Asp.Net MVC : Comment activer les tirets dans mes urls ?

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 ?

0 votes

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.

155voto

DaRKoN_ Points 4098

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.

Edit : Mise à jour pour MVC5

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

1 votes

C'est la vraie réponse. Je ne sais pas pourquoi Phil n'a pas ajouté cette information.

2 votes

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.

0 votes

@Eduardo Je pense que l'attribut ActionName a été ajouté pour la Preview 5, qui est sortie juste après le post de Phil.

16voto

Andi Points 5222

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

11voto

Ata S. Points 600

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

0 votes

Après avoir essayé une douzaine d'autres solutions que j'ai trouvées en ligne, c'est la première qui a fonctionné pour moi avec MVC5.

0 votes

Merci beaucoup.

1voto

Haacked Points 31070

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.

0 votes

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í .

0 votes

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).

1voto

Nexxas Points 146

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.

0 votes

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.com

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.

Powered by:

X