Comment accéder aux parameters de chaîne de requête dans asp.net mvc?

Je souhaite avoir un sorting et un filtrage différents appliqués à mes yeux. Je pensais que je passerais les parameters de sorting et de filtrage via la chaîne de requête:

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

Cette construction simple me permet de sortinger. La vue revient avec ceci dans la chaîne de requête:

 ?SortBy=Name 

Maintenant, je veux append du filtrage et je veux que ma chaîne de requête se termine avec

 ?SortBy=Name&Filter=Something 

Comment puis-je append un autre paramètre à la liste de ceux déjà existants dans ActionLink ? par exemple:

 user requests /Index/ 

voir a

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

et

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

Liens : Le premier ressemble à /Index/?SortBy=Name et Le second est /Index/?FilterBy=Name

Je veux que lorsque l’utilisateur appuie sur le lien de sorting après avoir appliqué du filtrage, le filtrage n’est pas perdu, j’ai donc besoin d’un moyen de combiner mes parameters. Je pense qu’il devrait y avoir un moyen de ne pas parsingr la chaîne de requête, mais d’obtenir une collection de parameters à partir d’un object MVC.

Jusqu’à présent, la meilleure façon de le faire est de créer une copie de ViewContext.RouteData.Values et d’y injecter des valeurs QuerySsortingng. puis modifiez-le avant chaque utilisation d’ ActionLink . essayant toujours de comprendre comment utiliser .Union() au lieu de modifier un dictionnaire tout le temps.

 <% 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)%> 

Ma solution est similaire à celle de qwerty1000. J’ai créé une méthode d’extension, ActionQueryLink , qui ActionQueryLink les mêmes parameters de base que ActionLink standard. Il effectue une boucle via Request.QuerySsortingng et ajoute tous les parameters trouvés dans le dictionnaire RouteValues qui ne sont pas déjà présents (afin que nous puissions remplacer la chaîne de requête d’origine si nécessaire).

Pour conserver la chaîne existante sans append de clé, l’utilisation serait la suivante:

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

Pour conserver la chaîne existante et append de nouvelles clés, l’utilisateur serait:

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

Le code ci-dessous est pour les deux utilisations, mais il devrait être assez facile d’append d’autres surcharges pour correspondre aux autres extensions ActionLink si nécessaire.

  public static ssortingng ActionQueryLink(this HtmlHelper htmlHelper, ssortingng linkText, ssortingng action) { return ActionQueryLink(htmlHelper, linkText, action, null); } public static ssortingng ActionQueryLink(this HtmlHelper htmlHelper, ssortingng linkText, ssortingng action, object routeValues) { var querySsortingng = htmlHelper.ViewContext.HttpContext.Request.QuerySsortingng; var newRoute = routeValues == null ? htmlHelper.ViewContext.RouteData.Values : new RouteValueDictionary(routeValues); foreach (ssortingng key in querySsortingng.Keys) { if (!newRoute.ContainsKey(key)) newRoute.Add(key, querySsortingng[key]); } return HtmlHelper.GenerateLink(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection, linkText, null /* routeName */, action, null, newRoute, null); } 
 <%= Html.ActionLink("Name", "Index", new { SortBy= "Name", Filter="Something"}) %> 

Pour préserver la chaîne de requête, vous pouvez:

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

Ou, si vous avez plus de parameters, vous pouvez créer le lien manuellement en utilisant Prise en Request.QuerySsortingng .

Utilisez ActionLinkCombined au lieu d’ ActionLink

  public static ssortingng ActionLinkCombined(this HtmlHelper htmlHelper, ssortingng linkText, ssortingng 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); } 

MVC4

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

OU

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

queryssortingng serait comme:

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

il aurait class="cssClass"