Подтвердить что ты не робот

Как получить доступ к параметрам строки запроса в asp.net mvc?

Я хочу, чтобы на моем представлении была применена другая сортировка и фильтрация Я понял, что буду передавать сортировку и фильтрацию параметров по строке запроса:

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

Эта простая конструкция позволяет сортировать. Просмотр возвращается с этим в строке запроса:

?SortBy=Name

Теперь я хочу добавить фильтрацию, и я хочу, чтобы строка запроса заканчивалась

?SortBy=Name&Filter=Something

Как добавить еще один параметр в список уже существующих в ActionLink? для примера:

user requests /Index/

view имеет

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

и

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

Ссылки: первый выглядит как /Index/?SortBy=Name, а второй /Index/?FilterBy=Name

Я хочу, чтобы пользователь нажал кнопку сортировки после того, как он применил некоторую фильтрацию. Фильтрация не теряется, поэтому мне нужен способ объединить мои параметры. Я предполагаю, что должен быть способ не разбирать строку запроса, а получать набор параметров из некоторого объекта MVC.

4b9b3361

Ответ 1

до сих пор лучшим способом, который я выяснил, является создание копии ViewContext.RouteData.Values и вводить в него значения QueryString. а затем изменить его перед каждым использованием ActionLink. все еще пытаясь понять, как использовать .Union() вместо изменения словаря все время.

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

Ответ 2

Мое решение похоже на qwerty1000's. Я создал метод расширения ActionQueryLink, который принимает те же основные параметры, что и стандартный ActionLink. Он зацикливается на Request.QueryString и добавляет все найденные параметры в словарь RouteValues, которые еще не присутствуют (поэтому при необходимости мы можем перезаписать исходную строку запроса).

Чтобы сохранить существующую строку, но не добавить какие-либо ключи, это будет:

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

Чтобы сохранить существующую строку и добавить новые ключи, пользователь будет:

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

Ниже приведен код для двух способов использования, но при этом необходимо добавить другие перегрузки, чтобы соответствовать другим расширениям ActionLink по мере необходимости.

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

Ответ 3

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

Чтобы сохранить запрос, вы можете:

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

Или, если у вас больше параметров, вы можете создать ссылку вручную, используя учетную запись Request.QueryString.

Ответ 4

Используйте ActionLinkCombined вместо 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);
    }

Ответ 5

MVC4

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

ИЛИ

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

querystring будет выглядеть так:

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

он имел бы class="cssClass"