当前位置:  开发笔记 > 后端 > 正文

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

如何解决《如何在asp.netmvc中访问查询字符串参数?》经验,为你挑选了3个好方法。

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

@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对象获取参数集合.



1> Alexander Ta..:

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


使用ASP.NET MVC 3或4做任何更好的方法吗?

2> Brian Cautho..:

我的解决方案类似于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);
    }



3> Mehrdad Afsh..:
<%= 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.

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有