如何在asp.net mvc中访问查询字符串参数?

Ale*_*ran 39 asp.net-mvc query-string

我想在我的视图上应用不同的排序和过滤我想我将通过查询字符串传递排序和过滤参数:

@Html.ActionLink("Name", "Index", new { SortBy= "Name"})
Run Code Online (Sandbox Code Playgroud)

这种简单的结构允许我排序.View在查询字符串中返回:

?SortBy=Name
Run Code Online (Sandbox Code Playgroud)

现在我想添加过滤,我希望我的查询字符串最终结束

?SortBy=Name&Filter=Something
Run Code Online (Sandbox Code Playgroud)

如何将其他参数添加到已存在的列表中ActionLink?例如:

user requests /Index/
Run Code Online (Sandbox Code Playgroud)

视图有

 @Html.ActionLink("Name", "Index", new { SortBy= "Name"})
Run Code Online (Sandbox Code Playgroud)

 @Html.ActionLink("Name", "Index", new { FilterBy= "Name"})
Run Code Online (Sandbox Code Playgroud)

链接:第一个看起来像/Index/?SortBy=Name,第二个是 /Index/?FilterBy=Name

我希望当用户按下排序链接后他应用了一些过滤 - 过滤不会丢失,所以我需要一种方法来组合我的参数.我的猜测是应该有一种方法不解析查询字符串,但从一些MVC对象获取参数集合.

Ale*_*ran 29

到目前为止,我想到的最好的方法是创建一个副本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)%>
Run Code Online (Sandbox Code Playgroud)

  • 使用ASP.NET MVC 3或4做任何更好的方法吗? (8认同)

Bri*_*hon 12

我的解决方案类似于qwerty1000.我创建了一个扩展方法,ActionQueryLink它接受与标准相同的基本参数ActionLink.它遍历Request.QueryString并将找到的任何参数添加到RouteValues字典中(如果需要,我们可以覆盖原始查询字符串).

要保留现有字符串但不添加任何键,用法将是:

<%= Html.ActionQueryLink("Click Me!","SomeAction") %>
Run Code Online (Sandbox Code Playgroud)

要保留现有字符串并添加新密钥,用户将:

<%= Html.ActionQueryLink("Click Me!","SomeAction", new{Param1="value1", Param2="value2"} %>
Run Code Online (Sandbox Code Playgroud)

下面的代码适用于两种用法,但是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);
    }
Run Code Online (Sandbox Code Playgroud)


Meh*_*ari 8

<%= Html.ActionLink("Name", "Index", new { SortBy= "Name", Filter="Something"}) %>
Run Code Online (Sandbox Code Playgroud)

要保留查询字符串,您可以:

<%= Html.ActionLink("Name", "Index", 
     String.IsNullOrEmpty(Request.QueryString["SortBy"]) ? 
        new { Filter = "Something" } : 
        new { SortBy=Request.QueryString["SortBy"], Filter="Something"}) %>
Run Code Online (Sandbox Code Playgroud)

或者,如果您有更多参数,则可以通过考虑使用手动构建链接Request.QueryString.