visual studio net mvc framework asp asp.net-mvc

asp.net-mvc - studio - mvc asp.net c#



Asp.Net MVC: ¿Cómo habilito los guiones en mis URL? (9)

Me gustaría tener guiones por separado en mis URL. Entonces, en lugar de:

/MyController/MyAction

Me gustaría:

/My-Controller/My-Action

es posible?


Asp.Net MVC 5 admitirá el enrutamiento de atributos, lo que permite un control más explícito sobre los nombres de las rutas. El uso de la muestra se verá así:

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

Para obtener este comportamiento para proyectos que usan Asp.Net MVC antes de v5, se puede encontrar una funcionalidad similar con el proyecto AttributeRouting (también disponible como nuget ). De hecho, Microsoft contactó al autor de AttributeRouting para ayudarlos con su implementación para MVC 5.


Desarrollé una biblioteca de código abierto NuGet para este problema que implícitamente convierte EveryMvc / Url en cada mvc / url.

Las URL en mayúsculas son problemáticas porque las rutas de las cookies son sensibles a las mayúsculas y minúsculas, la mayoría de Internet es realmente sensible a las mayúsculas y minúsculas, mientras que las tecnologías de Microsoft tratan las urls como insensibles a las mayúsculas y minúsculas. ( Más en mi blog )

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

Para instalarlo, simplemente abra la ventana de NuGet en el Visual Studio haciendo clic con el botón derecho en el Proyecto y seleccionando Administrador de paquetes NuGet, y en la pestaña "En línea" escriba "Ruta discontinua en minúsculas", y debería aparecer.

Alternativamente, puede ejecutar este código en la consola del Administrador de paquetes:

Install-Package LowercaseDashedRoute

Después de eso, debería abrir App_Start / RouteConfig.cs y comentar la ruta existente. LlameMapRoute (...) y agregue esto en su lugar:

routes.Add(new LowercaseDashedRoute("{controller}/{action}/{id}", new RouteValueDictionary( new { controller = "Home", action = "Index", id = UrlParameter.Optional }), new DashedRouteHandler() ) );

Eso es. Todas las URL son minúsculas, discontinuas y se convierten implícitamente sin que usted haga nada más.

URL del proyecto de código abierto: https://github.com/AtaS/lowercase-dashed-route


Esto es lo que hice al usar áreas en ASP.NET MVC 5 y funcionó como un encanto. No tuve que cambiar el nombre de mi punto de vista tampoco.

En RouteConfig.cs, haz esto:

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

En su controlador, agregue esto antes de su definición de clase:

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

La URL que aparece en el navegador si se prueba en la máquina local es: localhost / sample-area / my-action . No necesita cambiar el nombre de sus archivos de vista ni nada. Estaba bastante contento con el resultado final.

Después de habilitar los atributos de enrutamiento, puede eliminar cualquier archivo de registro de área que tenga, como SampleAreaRegistration.cs.

Este article me ayudó a llegar a esta conclusión. Espero que te sea útil.


Puede crear un controlador de ruta personalizado como se muestra en este 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); } }

... y la nueva ruta:

routes.Add( new Route("{controller}/{action}/{id}", new RouteValueDictionary( new { controller = "Default", action = "Index", id = "" }), new HyphenatedRouteHandler()) );

Aquí se hizo una pregunta muy similar: ASP.net MVC admite URL con guiones


Puede definir una ruta específica tal como:

routes.MapRoute( "TandC", // Route controllerName "CommonPath/{controller}/Terms-and-Conditions", // URL with parameters new { controller = "Home", action = "Terms_and_Conditions" } // Parameter defaults );

Pero esta ruta debe registrarse ANTES de su ruta predeterminada.


Puede escribir una ruta personalizada que se deriva de la clase de ruta GetRouteData para quitar guiones, pero cuando llame a las API para generar una URL, deberá recordar incluir los guiones para el nombre de la acción y el nombre del controlador.

Eso no debería ser demasiado difícil.


Puede usar el atributo ActionName de la siguiente manera:

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

Tenga en cuenta que luego tendrá que llamar a su archivo de vista "My-Action.cshtml" (o la extensión correspondiente). También necesitará hacer referencia a "my-action" en cualquier método Html.ActionLink.

No existe una solución tan simple para los controladores.

Editar: Actualización para MVC5

Habilite las rutas globalmente

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

Ahora con MVC5, el enrutamiento de atributos se ha absorbido en el proyecto. Ahora puede usar:

[Route("My-Action")]

En los métodos de acción.

Para los controladores, puede aplicar un atributo RoutePrefix que se aplicará a todos los métodos de acción en ese controlador:

[RoutePrefix("my-controller")]

Una de las ventajas de utilizar RoutePrefix es que los parámetros de URL también se transmitirán a cualquier método de acción.

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

Recorte..

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


Si tiene acceso al módulo Reescribir URL de IIS ( http://blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspx ), puede simplemente reescribir las URL

Las solicitudes a / my-controller / my-action se pueden reescribir en / mycontroller / myaction y luego no hay necesidad de escribir manejadores personalizados o cualquier otra cosa. Los visitantes obtienen URL bonitas y obtienes las que MVC puede entender.

Aquí hay un ejemplo de un controlador y una acción, pero puede modificar esto para que sea una solución más genérica:

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

La posible desventaja de esto es que tendrá que cambiar su proyecto para usar IIS Express o IIS para que las reescrituras funcionen durante el desarrollo.


Todavía soy bastante nuevo en MVC, así que tómalo con un grano de sal. No es una solución elegante, atrapante, pero funcionó en MVC4:

routes.MapRoute( name: "ControllerName", url: "Controller-Name/{action}/{id}", defaults: new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional } );