C# ASP.NET MVC中的分页和排序网格

C# ASP.NET MVC中的分页和排序网格,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我正在尝试在ASP.NET MVC中实现分页和排序列表,而不使用MVContrib网格或javascript(需要对seo友好) 我已用以下签名构建我的行动: ActionResult List(int? page, string sort, string direction); 我遇到的问题是如何使分页和排序都能正常工作。例如,假设我有以下代码: <%= Html.ActionLink("Title", "List", new { sort = "Title", direction =

我正在尝试在ASP.NET MVC中实现分页和排序列表,而不使用MVContrib网格或javascript(需要对seo友好)

我已用以下签名构建我的行动:

ActionResult List(int? page, string sort, string direction);
我遇到的问题是如何使分页和排序都能正常工作。例如,假设我有以下代码:

<%= Html.ActionLink("Title", "List", new { sort = "Title", direction = "ASC" }) %>

我希望这会生成一个包含所有现有路由值(包括当前页面)的url,但事实并非如此。因此,当您单击链接时,页面被设置回null

我已经查看了ActionLink帮助程序的所有重载,但是看起来没有任何帮助。我实际上需要做的是生成一个带有现有页面值(或任何其他路由值)和新排序参数的url/链接


如果有人能帮忙,我将不胜感激。谢谢。

您需要编写自己的html助手,这很容易做到。为此,请使用以下格式:

public static class MyExtensions
{
   public static string MyActionLink(this HtmlHelper html, ...)
   {
      //Definition, return string
   }
}
并用它来创造你自己的。您可以访问HTML帮助程序中的信息,以获取有关当前请求的信息(提取当前路由值并将其与现有路由值组合


HTH.

为什么不能在路由值中指定页面,如下所示

<%= Html.ActionLink("Title", "List", new { page = currentPage, sort = "Title", direction = "ASC" }) %>

问题解决了。我设法想出了以下扩展方法:

public static class ActionLinkExtensions
{
    public static MvcHtmlString ActionLink(this HtmlHelper helper, string linkText, string actionName, bool addExistingRouteValues)
    {
        return ActionLink(helper, linkText, actionName, null, null, addExistingRouteValues, null);
    }

    public static MvcHtmlString ActionLink(this HtmlHelper helper, string linkText, string actionName, object routeValues, bool addExistingRouteValues)
    {
        return ActionLink(helper, linkText, actionName, null, routeValues, addExistingRouteValues, null);
    }

    public static MvcHtmlString ActionLink(this HtmlHelper helper, string linkText, string actionName, string controllerName, object routeValues, bool addExistingRouteValues, object htmlAttributes)
    {
        var queryString = helper.ViewContext.HttpContext.Request.QueryString;
        var newRouteValues = routeValues == null ? helper.ViewContext.RouteData.Values : new RouteValueDictionary(routeValues);

        if (addExistingRouteValues)
        {
            foreach (string key in queryString.Keys)
            {
                if (!newRouteValues.ContainsKey(key))
                    newRouteValues.Add(key, queryString[key]);
            }
        }

        return MvcHtmlString.Create(HtmlHelper.GenerateLink(helper.ViewContext.RequestContext, helper.RouteCollection, linkText, null, actionName, controllerName, newRouteValues, new RouteValueDictionary(htmlAttributes)));
    }
}

现在,您所要做的就是在助手的末尾添加true,并添加现有的路由值。希望这会有所帮助。

Global.asax中的路由定义是什么?也许您只需要编写得更好……谢谢,但当我开始添加过滤时,我可以看到这种方法变得有点痛苦。我在cr中考虑得更多正在使用我自己的帮助器方法,该方法将生成指向现有url的链接,但也会覆盖我手动传入的参数。例如,假设我在/Users/Index?page=1&sort=Name页面上。如果我提供了:它将返回指向url/Users/Index?page=1&sort=Email的链接。我已经研究了如何使用该方法构建我自己的帮助器,但我没有考虑这对我来说是新鲜事。
public static class ActionLinkExtensions
{
    public static MvcHtmlString ActionLink(this HtmlHelper helper, string linkText, string actionName, bool addExistingRouteValues)
    {
        return ActionLink(helper, linkText, actionName, null, null, addExistingRouteValues, null);
    }

    public static MvcHtmlString ActionLink(this HtmlHelper helper, string linkText, string actionName, object routeValues, bool addExistingRouteValues)
    {
        return ActionLink(helper, linkText, actionName, null, routeValues, addExistingRouteValues, null);
    }

    public static MvcHtmlString ActionLink(this HtmlHelper helper, string linkText, string actionName, string controllerName, object routeValues, bool addExistingRouteValues, object htmlAttributes)
    {
        var queryString = helper.ViewContext.HttpContext.Request.QueryString;
        var newRouteValues = routeValues == null ? helper.ViewContext.RouteData.Values : new RouteValueDictionary(routeValues);

        if (addExistingRouteValues)
        {
            foreach (string key in queryString.Keys)
            {
                if (!newRouteValues.ContainsKey(key))
                    newRouteValues.Add(key, queryString[key]);
            }
        }

        return MvcHtmlString.Create(HtmlHelper.GenerateLink(helper.ViewContext.RequestContext, helper.RouteCollection, linkText, null, actionName, controllerName, newRouteValues, new RouteValueDictionary(htmlAttributes)));
    }
}