Мое решение похоже на qwerty1000. Я создал метод расширения 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);
}