Pregunta

Me gustaría tener guiones que separen las palabras en mis URL.Entonces en lugar de:

/MyController/MyAction

Me gustaría:

/My-Controller/My-Action

es posible?

¿Fue útil?

Solución

Puedes usar el atributo ActionName así:

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

Tenga en cuenta que luego deberá llamar a su archivo Ver "My-Action.cshtml" (o la extensión adecuada).También deberá hacer referencia a "mi-acción" en cualquier método Html.ActionLink.

No existe una solución tan sencilla 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, Attribute Routing ha sido absorbido por el proyecto.Ahora puedes usar:

[Route("My-Action")]

Sobre los métodos de acción.

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

[RoutePrefix("my-controller")]

Uno de los beneficios de utilizar RoutePrefix Estos 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

Otros consejos

Podrías 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: Soporte de ASP.net MVC para URL con guiones

He desarrollado un código abierto Biblioteca NuGet para este problema que convierte implícitamente EveryMvc/Url en each-mvc/url.

Las URL en mayúsculas son problemáticas porque las rutas de las cookies distinguen entre mayúsculas y minúsculas; en realidad, la mayor parte de Internet distingue entre mayúsculas y minúsculas, mientras que las tecnologías de Microsoft tratan las URL como si no distinguieran entre mayúsculas y minúsculas.(Más en la publicación de mi blog)

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

Para instalarlo, simplemente abra la ventana de NuGet en Visual Studio haciendo clic 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, debes abrir App_Start/RouteConfig.cs y comentar la llamada route.MapRoute(...) existente y agregar 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 todo.Todas las URL están en minúsculas, con guiones y se convierten implícitamente sin que usted haga nada más.

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

Esto es lo que hice usando áreas en ASP.NET MVC 5 y funcionó de maravilla.Tampoco tuve que cambiar el nombre de mis vistas.

En RouteConfig.cs, haga 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 la definición de su 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 realiza la prueba en una máquina local es: localhost/área-de-muestra/mi-acción.No es necesario cambiar el nombre de los archivos de visualización ni nada por el estilo.Quedé bastante contento con el resultado final.

Una vez habilitados los atributos de enrutamiento, puede eliminar cualquier archivo de registro de área que tenga, como SampleAreaRegistration.cs.

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

Asp.Net MVC 5 admitirá el enrutamiento de atributos, lo que permitirá un control más explícito sobre los nombres de las rutas.El uso de 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 en proyectos que utilizan Asp.Net MVC anterior a v5, se puede encontrar una funcionalidad similar con el Proyecto de enrutamiento de atributos (también disponible como pepita).De hecho, Microsoft contactó al autor de AttributeRouting para ayudarlo con su implementación para MVC 5.

Puede escribir una ruta personalizada que se derive de la clase Ruta GetRouteData para eliminar los 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 definir una ruta específica 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 tiene que estar registrada. ANTES su ruta predeterminada.

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

Las solicitudes a /my-controller/my-action se pueden reescribir en /mycontroller/myaction y luego no hay necesidad de escribir controladores personalizados ni nada más.Los visitantes obtienen bonitas URL y usted obtiene algunas que MVC puede entender.

A continuación se muestra un ejemplo para un controlador y una acción, pero puede modificarlo 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 cautela.No es una solución elegante y generalizada, pero me funcionó en MVC4:

routes.MapRoute(
    name: "ControllerName",
    url: "Controller-Name/{action}/{id}",
    defaults: new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional }
);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top