Pregunta

Estoy intentando crear un sitio simple.Básicamente tiene un controlador. Home controlador.

Este controlador tiene una acción. Index toma una string como argumento (que es un directorio) y usa ese 'directorio' para hacer su trabajo.

No puedo encontrar la manera de crear una ruta genérica que envíe todas las URL a esta acción.

Podría existir cualquier combinación de URL y cualquier cosa más allá del nombre de dominio debería ser la cadena.

http://<domain>/2008
http://<domain>/2008/09
http://<domain>/2008/09/Fred

¿Alguien sabe como hacer esto?También estaría bien si todos los valores se pasaran como una lista.

¿Existe una mejor manera de hacer esto?

¿Fue útil?

Solución

Prueba esto:

routes.MapRoute(
        "Default", "{*path}",
        new { controller = "Home", action = "Index" } 
    );

Y el controlador:

public class HomeController : Controller {
    public ActionResult Index(string path) {
        return View();
    }
}

Otros consejos

Mi primer pensamiento es que es una "mala idea".si puedes tomar cualquier cosa te pueden pedir una URL, tendrás que tener una gran lista negra (o lista blanca).Hay tantas vacantes.Una mejor manera sería explicar explícitamente esas rutas y cómo permitir los parámetros, y luego realizar acciones que se ocupen de esas rutas aceptadas.Entonces tendría una ruta genérica de captura total que redirigiría a una página de error.

Se siente como si estuvieras intentando mezclar manzanas y naranjas.ASP.NET MVC elimina intencionadamente la idea de "página".Realmente no hay razón para tener directorios para varios usuarios a menos que esté realizando algún tipo de E/S de archivos, y si ese es el caso, entonces se puede abstraer para que funcione en el paradigma ASP.NET MVC mucho más fácilmente de lo que piensa.

En ASP.NET MVC, si desea variar la información que busca según la cadena pasada (muy parecida a la cadena que pasó), aquí tiene una forma "segura" de hacerlo:

Método #1: Tres rutas, tres acciones, diferentes nombres

routes.MapRoute(
  "YearOnly",
  "{year}",
  new { controller = "Index", action = "ShowByYear" },
  new { year = @"\d{4}" }
);

routes.MapRoute(
  "YearAndMonth",
  "{year}/{month}",
  new { controller = "Index", action = "ShowByYearAndMonth" },
  new { year = @"\d{4}", month = @"\d{2}" }
);

routes.MapRoute(
  "YearMonthAndName",
  "{year}/{month}/{name}",
  new { controller = "Index", action = "ShowByYearMonthAndName" },
  new { year = @"\d{4}", month = @"\d{2}" }
);

Y luego usarías los valores de ruta pasados ​​en tus Acciones del Controlador para determinar cómo ven los datos:

ShowByYear(string year)
{
    //Return appropriate View here
}

ShowByYearAndMonth(string year, string month)
{ 
    //Return appropriate View here
}

ShowByYearMonthAndName(string year, string month, string name)
{ 
    //Return appropriate View here
}

Método n.º 2: método sugerido

routes.MapRoute(
  "YearOnly",
  "{year}",
  new { controller = "Index", action = "Show" },
  new { year = @"\d{4}" }
);

routes.MapRoute(
  "YearAndMonth",
  "{year}/{month}",
  new { controller = "Index", action = "Show" },
  new { year = @"\d{4}", month = @"\d{2}" }
);

routes.MapRoute(
  "YearMonthAndName",
  "{year}/{month}/{name}",
  new { controller = "Index", action = "Show" },
  new { year = @"\d{4}", month = @"\d{2}", name = "" }
);

Show(string year)
{
    //
}

Show(string year, string month)
{
    //Return appropriate View here
}

Show(string year, string month, string name)
{
    //Return appropriate View here
}

La belleza de este enfoque es que el MapRoute maneja el análisis de URL;y mantiene alejada a la gentuza.Luego puede configurar una ruta general que simplemente arroje un error.Preferiría realizar algunos análisis en el lado de la ruta con regex que en su controlador (en mi opinión).

Esto lo mantiene reducido a tres acciones sobrecargadas y permite un código más limpio y más parecido a 'MVC'.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top