2009-05-20 10 views
12

Qual è un buon modo per mantenere i valori di querystring in asp.net mvc?Come si mantengono i valori di querystring in asp.net mvc?

Se ho un URL:? /domande page = 2 & sorta = nuovi & articoli = 50 & showcomments = 1 & search = abcd

Sui collegamenti di paginazione voglio mantenere quei valori querystring in tutta la collegamenti in modo persistono quando l'utente clicca sulla "pagina successiva", per esempio (in questo caso il valore della pagina cambierebbero, ma il resto sarebbe rimasto lo stesso)

posso pensare di 2 modi per farlo:

  1. Request.Querystring nel visualizzare e aggiungere i valori ai link
  2. passano ogni valore querystring dal controller di nuovo nel visualizzare utilizzando Viewdata

È uno migliore rispetto agli altri? Sono quelle le uniche opzioni o c'è un modo migliore per farlo?

risposta

6

avrei elaborare il QueryString nella vista (la vostra opzione # 1), invece di passare in dal controller. Questo approccio rende la vista più autonoma, consentendo di convertirla in un controllo della vista e riutilizzarla attraverso diverse viste.

Nota: l'accesso a QueryString direttamente nella vista può sembrare una violazione del principio di progettazione di separazione tra Modello e Vista, ma in realtà questi dati sono una preoccupazione di navigazione correlata alla vista, non propriamente parte del modello.

+0

Grazie per l'input e il ragionamento. La tua nota è esattamente la ragione per cui ho pensato di passarlo attraverso ViewData. – dtc

1

Vorrei solo mantenere i valori nella Sessione in questo modo solo i collegamenti di paginazione devono avere;

/domande? Page = 2

/domande? Page = 3

L'unica ragione per cui non sarebbe noi QueryString è perché non voglio che l'utente per vedere il valori che sto passando al programma. Rende troppo facile per loro entrare nella barra degli indirizzi e iniziare a cambiare i valori per "vedere cosa succede". Con questo codice tutto quello che potevano fare è cambiare il numero della pagina.

+0

Questo è qualcosa che ho pensato per un secondo, ma ho voluto tenerlo nella querystring. – dtc

+0

un buon motivo per cui vuoi lasciare & sort = newest & items = 50 & showcomments = 1 & search = abcd nella querystring è così che le persone possono aggiungere un segnalibro alla ricerca.C'è qualche ragione per cui non vorresti che le persone modificassero direttamente il valore & search = nel querystanding e 'vedi cosa succede'? –

8

io uso un metodo di estensione per questo:

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

Non ci ho mai pensato. Sembra interessante ma forse troppo complicato per me. Speravo ci fosse qualche convenzione MVC che lo faccia senza dover scrivere righe di codice. – dtc

+0

Super! : thumbsup: – Haroon

0

Ecco come ho fatto in Asp.Net core, prima assegnare i parametri di stringa di query per ViewBags nel vostro controller:

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

    ... 
} 

quindi passare i valori ai tuoi link in questo 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> 

Nota che ogni link mantiene il proprio valore effettivo e passa il resto dei valori del percorso attraverso ciò che abbiamo passato a ViewBag.

Problemi correlati