2009-02-27 13 views
39

Voglio avere diverso ordinamento e filtro applicato sul mio punto di vista ho pensato che sarò di passaggio di ordinamento e filtraggio params attraverso query string:Come accedere ai parametri della stringa di query in asp.net mvc?

@Html.ActionLink("Name", "Index", new { SortBy= "Name"}) 

Questa costruzione semplice mi permette di ordinamento. Vedi torna con questo nella stringa di query:

?SortBy=Name 

Ora voglio aggiungere filtraggio e voglio che il mio stringa di query per finire con

?SortBy=Name&Filter=Something 

Come posso aggiungere un altro parametro alla lista dei già esistenti quelli in ActionLink? per esempio:

user requests /Index/ 

View ha

@Html.ActionLink("Name", "Index", new { SortBy= "Name"}) 

e

@Html.ActionLink("Name", "Index", new { FilterBy= "Name"}) 

Link: il primo si presenta come /Index/?SortBy=Name e il secondo è /Index/?FilterBy=Name

voglio quando l'utente collegamento di ordinamento premuto a ha applicato alcuni filtri - il filtraggio non è perso, quindi ho bisogno di un modo per combinare i miei parametri. La mia ipotesi è che ci dovrebbe essere un modo per non analizzare la stringa di query, ma ottenere la raccolta di parametri da qualche oggetto MVC.

+0

Che ne dici di un aggiornamento della sintassi del rasoio alla domanda? – MrBoJangles

+1

ci vai .. mi ci sono voluti solo 4 anni .. (-: –

risposta

29

finora il modo migliore che ho capito è creare una copia di ViewContext.RouteData.Values e inserire valori di QueryString in esso. e quindi modificarlo prima di ogni utilizzo di ActionLink. ancora cercando di capire come usare .Union() invece di modificare un dizionario tutto il tempo.

<% RouteValueDictionary tRVD = new RouteValueDictionary(ViewContext.RouteData.Values); %> 

<% foreach (string key in Request.QueryString.Keys) 
    { 
     tRVD[key]=Request.QueryString[key].ToString(); 
    } %> 

<%tRVD["SortBy"] = "Name"; %> 
       <%= Html.ActionLink("Name", "Index", tRVD)%> 
+0

Un'altra [domanda] (http://stackoverflow.com/questions/391023/make-namevaluecollection-accessible-to-linq-query/396504) indica che questo è il modo migliore quando si usa '@ Html.ActionLink'. Ho deciso per' Name '. – Grastveit

+8

Qualsiasi modo migliore per farlo usando ASP.NET MVC 3 o 4? –

+0

@LenielMacaferi, Vedi i modelli –

8
<%= Html.ActionLink("Name", "Index", new { SortBy= "Name", Filter="Something"}) %> 

per preservare la querystring è possibile:

<%= Html.ActionLink("Name", "Index", 
    String.IsNullOrEmpty(Request.QueryString["SortBy"]) ? 
     new { Filter = "Something" } : 
     new { SortBy=Request.QueryString["SortBy"], Filter="Something"}) %> 

O se avete più parametri, si potrebbe costruire il collegamento manualmente utilizzando prendendo Request.QueryString in considerazione.

4

Uso ActionLinkCombined invece di ActionLink

 public static string ActionLinkCombined(this HtmlHelper htmlHelper, string linkText, string actionName, 
              object routeValues) 
    { 
     var dictionary = new RouteValueDictionary(); 
     foreach (var pair in htmlHelper.ViewContext.Controller.ValueProvider) 
      dictionary[pair.Key] = pair.Value.AttemptedValue; 
     if (routeValues != null) 
     { 
      foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(routeValues)) 
      { 
       object o = descriptor.GetValue(routeValues); 
       dictionary[descriptor.Name] = o; 
      } 
     } 
     return htmlHelper.ActionLink(linkText, actionName, dictionary); 
    } 
12

La mia soluzione è simile a qwerty1000 di. Ho creato un metodo di estensione, ActionQueryLink, che utilizza gli stessi parametri di base dello standard ActionLink. Passa attraverso Request.QueryString e aggiunge tutti i parametri trovati al dizionario RouteValues che non sono già presenti (quindi possiamo sovrascrivere la stringa di query originale se necessario).

per preservare la stringa esistente, ma non aggiungere alcun tasto l'utilizzo potrebbe essere:

<%= Html.ActionQueryLink("Click Me!","SomeAction") %> 

Per preservare la stringa esistente e aggiungere nuove chiavi che l'utente potrebbe essere:

<%= Html.ActionQueryLink("Click Me!","SomeAction", new{Param1="value1", Param2="value2"} %> 

Il codice qui sotto è per i due usi, ma dovrebbe essere abbastanza facile aggiungere altri sovraccarichi per abbinare le altre estensioni ActionLink secondo necessità.

public static string ActionQueryLink(this HtmlHelper htmlHelper, 
     string linkText, string action) 
    { 
     return ActionQueryLink(htmlHelper, linkText, action, null); 
    } 

    public static string ActionQueryLink(this HtmlHelper htmlHelper, 
     string linkText, string action, object routeValues) 
    { 
     var queryString = 
      htmlHelper.ViewContext.HttpContext.Request.QueryString; 

     var newRoute = routeValues == null 
      ? htmlHelper.ViewContext.RouteData.Values 
      : new RouteValueDictionary(routeValues); 

     foreach (string key in queryString.Keys) 
     { 
      if (!newRoute.ContainsKey(key)) 
       newRoute.Add(key, queryString[key]); 
     } 
     return HtmlHelper.GenerateLink(htmlHelper.ViewContext.RequestContext, 
      htmlHelper.RouteCollection, linkText, null /* routeName */, 
      action, null, newRoute, null); 
    } 
2

MVC4

@Html.ActionLink("link text","action",new { @id = 5, @name = "textName", @abc = "abc" }) 

O

@Html.ActionLink("link text", "action", "controller", new { @id = 5, @name = "textName", @abc = "abc" }, new { @class = "cssClass" }) 

querystring sarebbe come:

yourDomainRout/action/5?name=textName&abc=abc 

avrebbe class="cssClass"

+0

vedi questa riga' new { @id = 5, @name = "textName", @abc = "abc"} 'perché usi @ segno molte volte. @ segno è usato per la parola chiave riservata. – Thomas

Problemi correlati