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

Как вы сохраняете значения querystring в asp.net mvc?

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

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

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

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

  • Request.Querystring в представлении и добавьте значения в ссылки
  • Передайте каждое значение запроса от контроллера обратно в представление с помощью ViewData​​li >

Один лучше другого? Являются ли они единственными опциями или есть лучший способ сделать это?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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