在ASP.NET MVC中连接查询字符串

3
我第一次使用ASP.NET MVC,目前一切进展顺利。但是我有一个小问题,希望有人能给我建议。
当页面可以执行多个任务并且通过评估查询字符串值在服务器上处理每个请求时,对于构建查询字符串的推荐解决方案是什么?
例如,产品列表用户可能会进行排序、分页和过滤。
用户执行排序-?sortcolumn=example 用户更改列表中的页面-?sortcolumn=example&page=3
用户对列表执行过滤-?sortcolumn=example&page=3&filter=expr 每个任务的Actionlink与其他任务完全分离,因此我需要在所有Html.ActionLink表达式中使用路由值。
希望有人能给予指导。
3个回答

4
感谢大家的帮助。最终,我创建了一个UrlHelper扩展方法,以便轻松构建需要传递所有活动url/querystring数据的url。我这样做是因为使用stringbuilder会非常困难,无法根据路由表中的匹配项开始更改url。
例如: /players/defender/4 或 players?sortcolumn=defender&page=4
使用此方法,我只需将所有内容放回路由引擎,并让它担心将url的哪些部分映射到url,将哪些部分映射到querystring。
using System.Web.Routing;

namespace System.Web.Mvc
{
    public static class UrlHelperExtensions
    {
        public static string RouteUrlIncludingQuerystring(this UrlHelper helper)
        {
            return helper.RouteUrlIncludingQuerystring(new RouteValueDictionary());
        }

        public static string RouteUrlIncludingQuerystring(this UrlHelper helper, object routeValues)
        {
            return helper.RouteUrlIncludingQuerystring(new RouteValueDictionary(routeValues));
        }

        public static string RouteUrlIncludingQuerystring(this UrlHelper helper, RouteValueDictionary routeValues)
        {
            RouteValueDictionary v = new RouteValueDictionary();

            foreach (var kvp in helper.RequestContext.RouteData.Values)
                v[kvp.Key] = kvp.Value;

            foreach (var kvp in helper.RequestContext.RouteData.DataTokens)
                v[kvp.Key] = kvp.Value;

            foreach (var key in helper.RequestContext.HttpContext.Request.QueryString.AllKeys)
                v[key] = helper.RequestContext.HttpContext.Request.QueryString[key];

            foreach (var kvp in routeValues)
                v[kvp.Key] = kvp.Value;

            return helper.RouteUrl(v);
        }
    }
}

2
您可以创建一个单一路由来访问特定的控制器方法,并根据需要向控制器方法添加参数。如果参数存在于查询字符串中,控制器方法将会接收它。如果参数不存在于查询字符串中,控制器方法中的参数将会是 null。
示例:
    public ActionResult ProductsBySystemIndex(int manufacturerID, string page, string sortOrder, string filter)
    {
         if (page != null)
         {
             // do something with page
         }
         // etc.
    }

0

看一下 MvcContrib 中的 Pager 助手 这里 他们使用的方法是调用一个帮助方法来创建链接,该方法将遍历当前查询字符串键并附加必要的值以进行页面导航(忽略当前页面但保留其他参数)。 该示例非常基本,因为它仅适用于分页,但可以轻松扩展以包括排序和过滤。


谢谢,Ariel。我还以为可能有更聪明的方法来做这个,但看起来好老式的stringbuilder仍然是最好的选择。 - William

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接