2010-08-27 28 views
5

¿Cómo puedo asignar múltiples de URL a la misma acción en asp.net mvcASP.NET MVC de múltiples URL a la misma acción

tengo:

string url1 = "Help/Me"; 
string url2 = "Help/Me/Now"; 
string url3 = "Help/Polemus"; 
string url1 = "Help/Polemus/Tomorow"; 

En mis global.asax.cs archivo que desea asignar a todos los URL para la siguiente acción:

public class PageController : Controller 
{ 
    [HttpGet] 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 
+0

Entonces, ¿la ayuda de la estrategia es algo para PageController? – Nix

+0

más en las líneas de ... Tengo una lista de URL aleatorias, y todas las URL aleatorias deben asignarse al PageController. Tenga en cuenta que la lista ya está definida ... así que básicamente necesito recorrer la lista y asignar cada url en esa lista al controlador de la página –

Respuesta

6

Añada la siguiente línea a su tabla de enrutamiento:

routes.MapRoute("RouteName", "Help/{Thing}/{OtherThing}", new { controller = "Page" }); 

EDITAR:

foreach(string url in urls) 
    routes.MapRoute("RouteName-" + url, url, new { controller = "Page", action = "Index" }); 
+0

esto es casi exactamente como lo que tenía ... probé su segundo ejemplo, sin embargo, cuando navego hacia esa url obtengo el error "no se puede encontrar el recurso", y tengo el "\ Views \ Page \ Index" asociado.aspx "ver. –

+0

Probar mi edición. (Olvidé el nombre de la acción) – SLaks

+0

jeje, con la edición, ahora es exactamente lo mismo que mi intento inicial :) –

3

basta con añadir las rutas en su tabla de rutas a medida que los necesita, al igual que cualquier otra ruta. Simplemente déles nombres únicos, URL codificada y apúntelos al mismo controlador/acción. Funcionará bien.

Si usa la coincidencia de patrones en lugar de las URL codificadas, solo asegúrese de obtener todas las rutas en el orden correcto para que se seleccione la correcta de la lista. Entonces/Help/Me debería aparecer antes de/Help/{Page} si la ruta codificada va a una página diferente al patrón coincidente. Si coloca/help/{page} en la ruta tabel 1st esto coincidirá con/help/me y su acción nombrada y codificada para esa ruta nunca se disparará.

En una nota lateral, si se trata de un sitio público y SEO es importante, tenga cuidado si tiene varias URL que devuelven los mismos datos, se marcarán como duplicados. Si este es el caso, entonces use la etiqueta Canonical, esto le da a todo el rango de página de todas las URLs que van a esa única página a la que usted nombra y elimina el problema de contenido duplicado para usted.

4

En mi caso, yo estaba buscando simplemente combinar dos rutas 'codificadas' en una y tropecé con esta publicación. Quería limpiar un poco mi RouteConfig.cs, porque tenía muchas rutas similares.

Terminé usando algunos simples 'o' lógica en una expresión regular y básicamente cambió:

routes.MapRoute(
    "UniqueHomePage", 
    "Default", 
    new { controller = "Redirector", action = "RedirectToRoot" } 
); 

routes.MapRoute(
    "UniqueHomePage2", 
    "Home", 
    new { controller = "Redirector", action = "RedirectToRoot" } 
); 

En un único camino:

routes.MapRoute(
    "UniqueHomePageGeneric", 
    "{url}", 
     new { controller = "Redirector", action = "RedirectToRoot" }, 
     new { url = "Home|Default" } 
); 

Nota para el SEO-Savy o -interested : El motivo por el que se apuntan varias URL a una y la misma acción es redirigirlas a una y la misma página nuevamente. En este caso, la página de inicio. Entonces, la idea es evitar problemas de contenido duplicado. Cuando utiliza este método para señalar acciones de redireccionamiento NO, pero acciones que muestran sus propias vistas, entonces puede estar CAUSANDO problemas de contenido duplicado: P.

17

Ahora en MVC 5 esto se puede lograr utilizando el atributo de ruta.

[Route("Help"/"Me")] 
[Route("Help/Me/Now")] 
[Route("Help/Polemus")] 
[Route("Help/Polemus/Tomorow")] 
public ActionResult Index() 
{ 
    return View(); 
} 
+1

Si Si está leyendo esto en 2017 o más adelante, esta es la solución. A continuación, si se pregunta cómo determinar _que 1_ de las múltiples rutas lo trajo a este Método de acción, puede usar 'ControllerContext.RouteData' y comparar las URL , [como se explica muy bien en esta otra respuesta de stackoverflow] (http://stackoverflow.com/a/39626076/325521) – Shiva

+3

Para que el atributo de ruta funcione, también debe agregar "run" es.MapMvcAttributeRoutes(); "en su archivo RouteConfig.cs antes de cualquiera de las otras rutas. [Publicación del blog de MSDN] (https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/) – joeshmoe301

Cuestiones relacionadas