Question

J'aimerais que des tirets séparent les mots dans mes URL.Donc au lieu de :

/MyController/MyAction

Je voudrais:

/My-Controller/My-Action

Est-ce possible?

Était-ce utile?

La solution

Vous pouvez utiliser l'attribut ActionName comme ceci :

[ActionName("My-Action")]
public ActionResult MyAction() {
    return View();
}

Notez que vous devrez alors appeler votre fichier View « My-Action.cshtml » (ou extension appropriée).Vous devrez également référencer « mon-action » dans toutes les méthodes Html.ActionLink.

Il n’existe pas de solution aussi simple pour les contrôleurs.

Modifier:Mise à jour pour MVC5

Activez les itinéraires globalement :

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapMvcAttributeRoutes();
    // routes.MapRoute...
}

Désormais, avec MVC5, le routage d'attributs a été intégré au projet.Vous pouvez désormais utiliser :

[Route("My-Action")]

Sur les méthodes d'action.

Pour les contrôleurs, vous pouvez appliquer un RoutePrefix attribut qui sera appliqué à toutes les méthodes d'action de ce contrôleur :

[RoutePrefix("my-controller")]

L'un des avantages de l'utilisation RoutePrefix Ces paramètres d'URL seront également transmis à toutes les méthodes d'action.

[RoutePrefix("clients/{clientId:int}")]
public class ClientsController : Controller .....

Couper..

[Route("edit-client")]
public ActionResult Edit(int clientId) // will match /clients/123/edit-client

Autres conseils

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 le nouveau parcours :

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 d'ASP.net MVC pour les URL avec tirets

J'ai développé un open source Bibliothèque NuGet pour ce problème qui convertit implicitement EveryMvc/Url en each-mvc/url.

Les URL en majuscules sont problématiques car les chemins des cookies sont sensibles à la casse, la majeure partie d'Internet est en fait sensible à la casse, tandis que les technologies Microsoft traitent les URL comme insensibles à la casse.(En savoir plus sur mon article de blog)

Forfait NuGet : https://www.nuget.org/packages/LowercaseDashedRoute/

Pour l'installer, ouvrez simplement la fenêtre NuGet dans Visual Studio en cliquant avec le bouton droit sur le projet et en sélectionnant NuGet Package Manager, puis dans l'onglet « En ligne », tapez « Route en pointillés minuscules », et elle devrait apparaître.

Alternativement, vous pouvez exécuter ce code dans la console du gestionnaire de packages :

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 URL 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

Voici ce que j'ai fait en utilisant des zones dans ASP.NET MVC 5 et cela a fonctionné à merveille.Je n'ai pas non plus eu besoin de renommer mes vues.

Dans RouteConfig.cs, procédez comme suit :

 public static void RegisterRoutes(RouteCollection routes)
    {
        // add these to enable attribute routing and lowercase urls, if desired
        routes.MapMvcAttributeRoutes();
        routes.LowercaseUrls = true;

        // routes.MapRoute...
    }

Dans votre contrôleur, ajoutez ceci avant la définition de votre classe :

[RouteArea("SampleArea", AreaPrefix = "sample-area")]
[Route("{action}")]
public class SampleAreaController: Controller
{
    // ...

    [Route("my-action")]
    public ViewResult MyAction()
    {
        // do something useful
    }
}

L'URL qui s'affiche dans le navigateur lors du test sur une machine locale est : localhost/zone-échantillon/mon-action.Vous n'avez pas besoin de renommer vos fichiers de vue ou quoi que ce soit.J'étais assez content du résultat final.

Une fois les attributs de routage activés, vous pouvez supprimer tous les fichiers d'enregistrement de zone dont vous disposez, tels que SampleAreaRegistration.cs.

Ce article m'a aidé à arriver à cette conclusion.J'espère que cela vous sera utile.

Asp.Net MVC 5 prendra en charge le routage d'attributs, permettant un contrôle plus explicite sur les noms de routes.Un exemple d'utilisation ressemblera à :

[RoutePrefix("dogs-and-cats")]
public class DogsAndCatsController : Controller
{
    [HttpGet("living-together")]
    public ViewResult LivingTogether() { ... }

    [HttpPost("mass-hysteria")]
    public ViewResult MassHysteria() { }
}

Pour obtenir ce comportement pour les projets utilisant Asp.Net MVC antérieurs à la version 5, des fonctionnalités similaires peuvent être trouvées avec le Projet AttributeRouting (aussi disponible sous forme de nuget).En fait, Microsoft a contacté l'auteur d'AttributeRouting pour l'aider dans sa mise en œuvre pour MVC 5.

Vous pouvez écrire une route personnalisée dérivée de la classe Route GetRouteData pour supprimer les tirets, mais lorsque vous appelez les API pour générer une URL, vous devrez vous rappeler d'inclure les tirets pour le nom de l'action et le nom du contrôleur.

Cela ne devrait pas être trop difficile.

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 cet itinéraire doit être enregistré AVANT votre itinéraire par défaut.

Si vous avez accès au module IIS URL Rewrite ( http://blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspx ), vous pouvez simplement réécrire les URL.

Les requêtes adressées à /my-controller/my-action peuvent être réécrites dans /mycontroller/myaction et il n'est alors pas nécessaire d'écrire des gestionnaires personnalisés ou quoi que ce soit d'autre.Les visiteurs obtiennent de jolies URL et vous obtenez celles que MVC peut comprendre.

Voici un exemple pour un contrôleur et une action, mais vous pouvez le modifier pour en faire une solution plus générique :

<rewrite>
  <rules>
    <rule name="Dashes, damnit">
      <match url="^my-controller(.*)" />
      <action type="Rewrite" url="MyController/Index{R:1}" />
    </rule>
  </rules>
</rewrite>

L'inconvénient possible est que vous devrez changer votre projet pour utiliser IIS Express ou IIS pour que les réécritures fonctionnent pendant le développement.

Je suis encore assez nouveau sur MVC, alors prenez-le avec des pincettes.Ce n'est pas une solution élégante et fourre-tout, mais cela a fait l'affaire pour moi dans MVC4 :

routes.MapRoute(
    name: "ControllerName",
    url: "Controller-Name/{action}/{id}",
    defaults: new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional }
);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top