Как вы сохраняете значения строки запроса в asp.net mvc? - PullRequest
12 голосов
/ 20 мая 2009

Каков хороший способ сохранить значения строки запроса в asp.net mvc?

Если у меня есть URL: / Вопросы? Страница = 2 & сортировки = Новейший и элементы = 50 & showcomments = 1 & поиск = ABCD

В ссылках подкачки я хочу сохранить эти значения строки запроса во всех ссылках, чтобы они сохранялись, например, когда пользователь нажимает «следующую страницу» (в этом случае значение страницы изменится, но остальные останутся прежними)

Я могу придумать 2 способа сделать это:

  1. Request.Querystring в представлении и добавьте значения к ссылкам
  2. Передайте каждое значение строки запроса из контроллера обратно в представление с использованием ViewData

Один лучше другого? Это единственные варианты или есть лучший способ сделать это?

Ответы [ 4 ]

8 голосов
/ 21 мая 2009

Я использую метод расширения для этого:

public static string RouteLinkWithExtraValues(
        this HtmlHelper htmlHelper,
        string name,
        object values)
    {
        var routeValues = new RouteValueDictionary(htmlHelper.ViewContext.RouteData.Values);

        var extraValues = new RouteValueDictionary(values);
        foreach (var val in extraValues)
        {
            if (!routeValues.ContainsKey(val.Key))
                routeValues.Add(val.Key, val.Value);
            else
                routeValues[val.Key] = val.Value;
        }

        foreach (string key in htmlHelper.ViewContext.HttpContext.Request.Form)
        {
            routeValues[key] = htmlHelper.ViewContext.HttpContext.Request.Form[key];
        }

        foreach (string key in htmlHelper.ViewContext.HttpContext.Request.QueryString)
        {
            if (!routeValues.ContainsKey(key) && htmlHelper.ViewContext.HttpContext.Request.QueryString[key] != "")
                routeValues[key] = htmlHelper.ViewContext.HttpContext.Request.QueryString[key];
        }

        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);

        return string.Format("<a href=\"{0}\">{1}</a>", urlHelper.RouteUrl(routeValues), name);
    }
6 голосов
/ 21 мая 2009

Я бы обработал QueryString в представлении (ваш вариант # 1) вместо того, чтобы передавать его из контроллера. Этот подход делает представление более автономным, позволяя вам преобразовать его в элемент управления представления и повторно использовать его в разных представлениях.

Примечание. Доступ к QueryString непосредственно в представлении может показаться нарушением принципа разделения модели и представления, но в действительности эти данные представляют собой навигационную проблему, связанную с представлением, а не частью модели. .

1 голос
/ 01 марта 2018

Вот как я это сделал в Asp.Net Core, сначала назначьте параметры строки запроса для ViewBags в вашем контроллере:

[HttpGet("/[controller]/[action]/{categoryId?}/{contractTypeId?}/{locationId?}")]
public IActionResult Index(Guid categoryId, int contractTypeId, Guid locationId)
{
    ViewBag.CategoryId = categoryId;
    ViewBag.ContractTypeId = contractTypeId;
    ViewBag.LocationId = locationId;

    ...
}

Затем передайте значения вашим ссылкам следующим образом:

<a asp-action="Index" asp-controller="Jobs"
   asp-route-categoryId="@teachingCategory.Id"
   asp-route-contractTypeId="@ViewBag.ContractTypeId"
   asp-route-locationId="@ViewBag.LocationId">
   @teachingCategory.Description (@teachingCategory.Rank)
</a>

<a asp-action="Index" asp-controller="Jobs"
   asp-route-categoryId="@ViewBag.CategoryId"
   asp-route-contractTypeId="@typeOfEmployment.Id"
   asp-route-locationId="@ViewBag.LocationId">
   @typeOfEmployment.Name
</a>

<a asp-action="Index" asp-controller="Jobs"
   asp-route-categoryId="@ViewBag.CategoryId"
   asp-route-contractTypeId="@ViewBag.ContractTypeId"
   asp-route-locationId="@item.Id">
   @item.Id
</a>

Обратите внимание, что каждая ссылка сохраняет свое собственное фактическое значение и передает остальные значения маршрута через то, что мы передали ViewBag.

1 голос
/ 21 мая 2009

Я бы просто сохранил значения в сеансе так, как должны иметь только ссылки на пейджинг;

/ вопросы? Страница = 2

/ вопросы? Страница = 3

Единственная причина, по которой я не стал бы использовать QueryString, заключается в том, что я не хочу, чтобы пользователь видел значения, которые я передаю программе. Для них слишком легко войти в адресную строку и начать изменять значения, чтобы «увидеть, что происходит». С этим кодом все, что они могли сделать, это изменить номер страницы.

...