2009-05-20 17 views
12

¿Cuál es una buena manera de conservar los valores de la cadena de consulta en asp.net mvc?¿Cómo se persisten los valores de la cadena de consulta en asp.net mvc?

Si tengo una url:? /preguntas page = 2 & tipo = más nuevos & artículos = 50 & showcomments = 1 & búsqueda = ABCD

En los enlaces de paginación quiero mantener esos valores cadena de consulta en todo el enlaces por lo que persisten cuando el usuario hace clic en la "página siguiente", por ejemplo (en este caso el valor de la página cambiarían, pero el resto se mantendrá igual)

puedo pensar en 2 maneras de hacer esto:

  1. Request.Querystring en la vista y añadir los valores a los enlaces
  2. pase cada valor cadena de consulta desde el controlador de nuevo en la vista utilizando ViewData

Es uno mejor que el otro? ¿Son esas las únicas opciones o hay una mejor manera de hacer esto?

Respuesta

6

Me gustaría procesar la cadena de consulta en la vista (su opción # 1), en lugar de pasar en desde el controlador. Este enfoque hace que la vista sea más autónoma, lo que le permite convertirla en un control de vista y volver a usarla en diferentes vistas.

Nota: Acceder a QueryString directamente en la vista puede parecer una violación del principio de diseño de separar el Modelo y la Vista, pero en realidad estos datos son un problema de navegación que está relacionado con la vista, no realmente parte del modelo.

+0

Gracias por la entrada y el razonamiento. Su nota es exactamente la razón por la que pensé pasarla a través de ViewData. – dtc

1

Me limitaría a mantener los valores en la sesión de esa manera los enlaces de búsqueda solo necesitan tener;

/preguntas? Page = 2

/preguntas? Page = 3

La única razón por la que no nos haría la cadena de consulta es porque no quiero que el usuario vea la valores que estoy pasando al programa. Hace que sea demasiado fácil para ellos ir a la barra de direcciones y comenzar a cambiar los valores para 'ver qué pasa'. Con este código, todo lo que podrían hacer es cambiar el número de página.

+0

Eso es algo en lo que pensé por un segundo pero quería mantenerlo en la cadena de consulta. – dtc

+0

una buena razón por la que le gustaría irse y ordenar = más nuevo & items = 50 & showcomments = 1 & search = abcd en la querystring es para que las personas puedan marcar la búsqueda.¿Hay alguna razón por la que no le gustaría que las personas editen directamente el valor & search = en la consulta y 'ver qué pasa'? –

8

utilizo un método de extensión para que:

public static string RouteLinkWithExtraValues(
     this HtmlHelper htmlHelper, 
     string name, 
     object values) 
    { 
     var routeValues = new RouteValueDictionary(htmlHelper.ViewContext.RouteData.Values); 

     var extraValues = new RouteValueDictionary(values); 
     foreach (var val in extraValues) 
     { 
      if (!routeValues.ContainsKey(val.Key)) 
       routeValues.Add(val.Key, val.Value); 
      else 
       routeValues[val.Key] = val.Value; 
     } 

     foreach (string key in htmlHelper.ViewContext.HttpContext.Request.Form) 
     { 
      routeValues[key] = htmlHelper.ViewContext.HttpContext.Request.Form[key]; 
     } 

     foreach (string key in htmlHelper.ViewContext.HttpContext.Request.QueryString) 
     { 
      if (!routeValues.ContainsKey(key) && htmlHelper.ViewContext.HttpContext.Request.QueryString[key] != "") 
       routeValues[key] = htmlHelper.ViewContext.HttpContext.Request.QueryString[key]; 
     } 

     var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext); 

     return string.Format("<a href=\"{0}\">{1}</a>", urlHelper.RouteUrl(routeValues), name); 
    } 
+0

Nunca pensé en esto. Parece interesante, pero tal vez demasiado complicado para mí. Esperaba que hubiera alguna convención de MVC que hiciera esto sin tener que escribir líneas de código. – dtc

+0

¡Súper! : thumbsup: – Haroon

0

Así es como lo he hecho en Asp.Net Core, primero asigne los parámetros de cadena de consulta a ViewBags en su controlador:

[HttpGet("/[controller]/[action]/{categoryId?}/{contractTypeId?}/{locationId?}")] 
public IActionResult Index(Guid categoryId, int contractTypeId, Guid locationId) 
{ 
    ViewBag.CategoryId = categoryId; 
    ViewBag.ContractTypeId = contractTypeId; 
    ViewBag.LocationId = locationId; 

    ... 
} 

A continuación, pasar los valores a sus enlaces de este modo:

<a asp-action="Index" asp-controller="Jobs" 
    asp-route-categoryId="@teachingCategory.Id" 
    asp-route-contractTypeId="@ViewBag.ContractTypeId" 
    asp-route-locationId="@ViewBag.LocationId"> 
    @teachingCategory.Description (@teachingCategory.Rank) 
</a> 

<a asp-action="Index" asp-controller="Jobs" 
    asp-route-categoryId="@ViewBag.CategoryId" 
    asp-route-contractTypeId="@typeOfEmployment.Id" 
    asp-route-locationId="@ViewBag.LocationId"> 
    @typeOfEmployment.Name 
</a> 

<a asp-action="Index" asp-controller="Jobs" 
    asp-route-categoryId="@ViewBag.CategoryId" 
    asp-route-contractTypeId="@ViewBag.ContractTypeId" 
    asp-route-locationId="@item.Id"> 
    @item.Id 
</a> 

Tenga en cuenta que cada enlace mantiene su propio valor real y pasa el resto de los valores de ruta a través de lo que pasamos a ViewBag.

Cuestiones relacionadas