web-dev-qa-db-fra.com

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

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.

39
Alexander Taran

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)%>
29
Alexander Taran

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);
    }
12
Brian Cauthon
<%= 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.

8
Mehrdad Afshari

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);
    }
4
user170868

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"

2
syed Ahsan Jaffri