Если бы мне пришлось угадывать, я бы сказал, по причинам исторической / обратной совместимости.
Oracle впервые появился в 1977 году, и, вероятно, с технологией того времени вычислительно дорого было делать дополнительную работу для поиска без учета регистра, поэтому они просто выбрали точное совпадение.
Я бы обработал QueryString в представлении (ваш вариант №1) вместо того, чтобы передавать его из контроллера. Такой подход делает представление более самодостаточным, позволяя преобразовать его в элемент управления представлением и повторно использовать его в разных представлениях.
Примечание. Доступ к QueryString непосредственно в представлении может показаться нарушением принципа проектирования разделение модели и представления, но на самом деле эти данные представляют собой проблему навигации, которая связана с представлением, а не на самом деле частью модели.
Я использую для этого метод расширения:
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);
}
Я бы просто сохранил значения в сеансе таким образом, чтобы ссылки для пейджинга были только необходимы;
/ questions? Page = 2
/ questions? Page = 3
Единственная причина, по которой я не хочу использовать QueryString, заключается в том, что я не хочу, чтобы пользователь видел значения, которые я передаю программе. Это позволяет им легко зайти в адресную строку и начать изменять значения, чтобы «посмотреть, что происходит». С помощью этого кода все, что они могли сделать, это изменить номер страницы.