Je veux avoir un tri et un filtrage différents appliqués sur ma vue J'ai pensé que je passerais des paramètres de tri et de filtrage via la chaîne de requête:
@Html.ActionLink("Name", "Index", new { SortBy= "Name"})
Cette construction simple me permet de trier. La vue revient avec ceci dans la chaîne de requête:
?SortBy=Name
Maintenant, je veux ajouter un filtrage et je veux que ma chaîne de requête se retrouve avec
?SortBy=Name&Filter=Something
Comment puis-je ajouter un autre paramètre à la liste de ceux déjà existants dans ActionLink
? par exemple:
user requests /Index/
la vue 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 l'utilisateur appuie sur le lien de tri après avoir appliqué un filtrage - le filtrage n'est pas perdu, j'ai donc besoin d'un moyen de combiner mes paramètres. Je suppose qu'il devrait y avoir un moyen de ne pas analyser la chaîne de requête, mais d'obtenir une collection de paramètres à partir d'un objet MVC.
jusqu'à présent, le meilleur moyen que j'ai trouvé est de créer une copie de ViewContext.RouteData.Values
et d'y injecter des valeurs QueryString. puis modifiez-le avant chaque ActionLink
utilisation. 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 prend les mêmes paramètres de base que la norme ActionLink
. Il parcourt Request.QueryString et ajoute tous les paramètres 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 mais n'ajouter aucune clé, l'utilisation serait la suivante:
<%= Html.ActionQueryLink("Click Me!","SomeAction") %>
Pour conserver la chaîne existante et ajouter 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'ajouter d'autres surcharges pour correspondre aux autres extensions ActionLink
selon les besoins.
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);
}
<%= Html.ActionLink("Name", "Index", new { SortBy= "Name", Filter="Something"}) %>
Pour conserver 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 paramètres, vous pouvez créer le lien manuellement en utilisant Request.QueryString
en compte.
Utilisez ActionLinkCombined
au lieu de 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);
}
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" })
querystring serait comme:
yourDomainRout/action/5?name=textName&abc=abc
il aurait class="cssClass"