我想在我的视图上应用不同的排序和过滤我想我将通过查询字符串传递排序和过滤参数:
@Html.ActionLink("Name", "Index", new { SortBy= "Name"})
这种简单的结构允许我排序.View在查询字符串中返回:
?SortBy=Name
现在我想添加过滤,我希望我的查询字符串最终结束
?SortBy=Name&Filter=Something
如何将其他参数添加到已存在的列表中ActionLink
?例如:
user requests /Index/
视图有
@Html.ActionLink("Name", "Index", new { SortBy= "Name"})
和
@Html.ActionLink("Name", "Index", new { FilterBy= "Name"})
链接:第一个看起来像/Index/?SortBy=Name
,第二个是 /Index/?FilterBy=Name
我希望当用户按下排序链接后他应用了一些过滤 - 过滤不会丢失,所以我需要一种方法来组合我的参数.我的猜测是应该有一种方法不解析查询字符串,但从一些MVC对象获取参数集合.
到目前为止,我想到的最好的方法是创建一个副本ViewContext.RouteData.Values
并将QueryString值注入其中.然后在每次ActionLink
使用之前修改它.仍然试图弄清楚如何使用.Union()
而不是一直修改字典.
<% RouteValueDictionary tRVD = new RouteValueDictionary(ViewContext.RouteData.Values); %> <% foreach (string key in Request.QueryString.Keys ) { tRVD[key]=Request.QueryString[key].ToString(); } %> <%tRVD["SortBy"] = "Name"; %> <%= Html.ActionLink("Name", "Index", tRVD)%>
我的解决方案类似于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); }
<%= Html.ActionLink("Name", "Index", new { SortBy= "Name", Filter="Something"}) %>
要保留查询字符串,您可以:
<%= Html.ActionLink("Name", "Index", String.IsNullOrEmpty(Request.QueryString["SortBy"]) ? new { Filter = "Something" } : new { SortBy=Request.QueryString["SortBy"], Filter="Something"}) %>
或者,如果您有更多参数,则可以通过考虑使用手动构建链接Request.QueryString
.