asp.net-mvc - route - select asp-for asp-items
Anexión de rutas de param=a mvc (2)
Algunos sitios MVC tienen params de querystring agregados a la ruta Url (de los cuales noté que StackOverflow lo hace), como por ejemplo:
https://stackoverflow.com/questions/tagged/java ? page = 9802 & sort = newest & pagesize = 15
¿Cuáles son las ventajas de tener los parámetros como más convencionales? Querystring params, en lugar de / param / values /?
Además, ¿cómo se añaden estos parámetros a las rutas que se han configurado? Estoy familiarizado con la configuración de rutas de mvc con parámetros como "users / details / {id}", etc., pero no sé cómo configurar rutas para usar con 1 o más? Params según la url de ejemplo anterior.
Los parámetros de cadena de consulta son útiles cuando tiene múltiples parámetros opcionales y no desea incluir valores predeterminados para parámetros no especificados solo para satisfacer una ruta.
Y no tiene que hacer nada especial para incluir estos parámetros en una URL procesada.
Tome la siguiente ruta, por ejemplo:
routes.MapRoute
(
"QuestionsTagged",
"questions/tagged/{tag}",
new { controller = "Questions", action = "Tagged" }
);
Si renderizas un enlace a esa ruta usando:
Url.RouteUrl
(
"QuestionsTagged",
new
{
tag = "java",
page = 9802,
sort = "newest",
pagesize = 15
}
)
... entonces el motor de enrutamiento es lo suficientemente inteligente como para ver que la ruta contiene un parámetro llamado tag
y que el objeto de valores de ruta pasada también tiene algo llamado tag
por lo que usa ese valor en la ruta.
Todos los valores de ruta proporcionados que no tienen los parámetros correspondientes en la ruta ( page
, sort
y pagesize
en este caso) se agregan como parámetros de cadena de consulta. Entonces, la llamada Url.RouteUrl
anterior devolverá /questions/tagged/java?page=9802&sort=newest&pagesize=15
.
Y su método de acción puede enumerar explícitamente estos parámetros en su firma (promueve la legibilidad y el mantenimiento) o puede acceder a ellos a través de Request.QueryString
.
public class QuestionsController : Controller
{
// I can explicitly list the parameters in my signature and let routing do
// its magic, like this...
public ViewResult Tagged(string tag, int? page, int? pagesize)
{
// ...or I can grab parameters like this:
string sort = Request.QueryString["sort"];
return View();
}
}
Tenga en cuenta que los parámetros del método de acción no tienen que coincidir con los parámetros especificados en la ruta. (En la ruta, solo especifiqué la tag
, pero la firma del método de acción enumera tag
, page
y pagesize
page
.) Sin embargo, cualquier parámetro del método de acción que no sea también un parámetro de la ruta debe ser de tipo de referencia o anulable.
Normalmente, he visto que los datos de búsqueda y filtrado se pasan como parámetros de cadena de consulta, ya que dan información al usuario en el URI. Normalmente, también es inofensivo que un usuario modifique estos datos, ya que solo filtrará los datos que ve en la página. Por lo general, todos los datos confidenciales se publican de manera que no se vean o modifiquen con la misma facilidad, pero yo abogaría por mantener el URI limpio y usar quesrystrings lo menos posible.
No necesita hacer nada especial al especificar las rutas para poder manejar quesrystrings. Simplemente serán datos adicionales que se pasan a su acción. En su acción, tendrá que trabajar un poco para manejar los datos. Usando su cadena de consulta anterior, tendrá que especificar los nombres de la cadena de consulta como los nombres de los parámetros y, luego, el tipo de datos que esté esperando.
public ActionResult Index (int page, string sort, int pagesize)
En este ejemplo, la página tendrá el valor de 9802, el orden será "más reciente" y el tamaño de página será 15.