Как вы сохраняете значения querystring в asp.net mvc?
Что такое хороший способ сохранить значения querystring в asp.net mvc?
Если у меня есть URL:
?/Вопросы страница = 2 & сорт = новейший & элементы = 50 & showcomments = 1 & поиск = ABCD
В пейджинговых ссылках я хочу сохранить эти значения запроса во всех ссылках, чтобы они сохранялись, когда пользователь нажимает на "следующую страницу", например (в этом случае значение страницы изменится, а остальное останется неизменным)
Я могу придумать два способа сделать это:
- Request.Querystring в представлении и добавьте значения в ссылки
- Передайте каждое значение запроса от контроллера обратно в представление с помощью ViewDatali >
Один лучше другого? Являются ли они единственными опциями или есть лучший способ сделать это?
Ответы
Ответ 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, заключается в том, что я не хочу, чтобы пользователь видел значения, которые я передаю в программу. Слишком просто для них войти в адресную строку и начать изменять значения, чтобы "видеть, что происходит". С помощью этого кода все, что они могут сделать, это изменить номер страницы.