Jak uzyskać dostęp do parametrów ciągu zapytania w asp.net mvc?

Chcę mieć inne sortowanie i filtrowanie w moim widoku Pomyślałem, że będę przekazywał sortowanie i filtrowanie params przez ciąg zapytania:

@Html.ActionLink("Name", "Index", new { SortBy= "Name"})
Ta prosta konstrukcja pozwala mi sortować. Widok wraca z tym w łańcuchu zapytań:
?SortBy=Name

Teraz chcę dodać filtrowanie i chcę, aby mój ciąg zapytania kończył się

?SortBy=Name&Filter=Something

Jak dodać kolejny parametr do listy już istniejących w ActionLink? na przykład:

user requests /Index/

Widok has

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

I

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

Linki : pierwszy wygląda jak /Index/?SortBy=Name a drugi to /Index/?FilterBy=Name

Chcę, gdy użytkownik naciśnięty sortowanie link po zastosowaniu jakiegoś filtrowania-filtrowanie nie jest stracone, więc potrzebuję sposób, aby połączyć moje params. Domyślam się, że powinien być sposób, aby nie parsować ciągu zapytania, ale uzyskać zbiór parametrów z jakiegoś obiektu MVC.

Author: Alexander Taran, 2009-02-27

5 answers

Jak na razie najlepszym sposobem na to jest stworzenie kopii ViewContext.RouteData.Values i wprowadzić do niego wartości QueryString. a następnie zmodyfikować go przed każdym użyciem ActionLink. wciąż próbuję dowiedzieć się, jak używać .Union() zamiast cały czas modyfikować słownik.

<% 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
Author: Alexander Taran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-28 06:40:06

Moje rozwiązanie jest podobne do qwerty1000. stworzyłem metodę rozszerzenia ActionQueryLink, która przyjmuje te same podstawowe parametry, co standard ActionLink. Zapętla żądanie.QueryString i dodaje wszystkie znalezione parametry do słownika RouteValues, które nie są jeszcze obecne (więc możemy zastąpić oryginalny ciąg zapytania w razie potrzeby).

Aby zachować istniejący ciąg znaków, ale nie dodać żadnych kluczy, użycie będzie następujące:

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

Aby zachować istniejący ciąg znaków i dodać nowe klucze, użytkownik be:

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

Poniższy kod dotyczy dwóch zastosowań, ale powinno być dość łatwo dodać inne przeciążenia, aby dopasować inne rozszerzenia ActionLink w razie potrzeby.

    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
Author: Brian Cauthon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-28 06:41:09
<%= Html.ActionLink("Name", "Index", new { SortBy= "Name", Filter="Something"}) %>

Aby zachować querystring możesz:

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

Lub jeśli masz więcej parametrów, możesz zbudować link ręcznie, biorąc pod uwagę Request.QueryString.

 8
Author: Mehrdad Afshari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-27 09:18:47

Użyj ActionLinkCombined zamiast 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
Author: user170868,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-28 06:41:43

MVC4

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

lub

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

Querystring będzie jak:

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

To by było class="cssClass"

 2
Author: syed Ahsan Jaffri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-04 05:24:33