在ASP.NET MVC中分页和排序网格

时间:2010-07-27 15:44:50

标签: 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 = "ASC" }) %>

我希望这会生成一个包含所有现有路由值(包括当前页面)的URL,但它不会。因此,当您单击链接时,页面将设置为null。

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

如果有人可以提供帮助,我会很感激。感谢。

3 个答案:

答案 0 :(得分:0)

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

public static class MyExtensions
{
   public static string MyActionLink(this HtmlHelper html, ...)
   {
      //Definition, return string
   }
}

并使用它来创建自己的。您可以访问HTML帮助程序中的信息以获取有关当前请求的信息(提取当前路径值并将它们与现有路径值组合...

HTH。

答案 1 :(得分:0)

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

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

我会猜测ActionResult List(int? page, string sort, string direction);的模型是您当前的项目列表,因此您还没有获得currentPage。如果是这种情况,请创建一个包含列表和currentPage的视图模型。 e.g。

// View Model
public class MyViewModel
{
    public int CurrentPage { get; set; }
    public IList<SomeObject> Items { get; set; }
}

// Action Method
public ActionResult List(int? page, string sort, string direction)
{
    return View(new MyViewModel()
    {
        CurrentPage = page ?? 1,
        Items       = _myRepository.GetPagedList(page, sort, direction);
    });
}

// View
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyProject.Controllers.MyController.MyViewModel>" %>
...

<%= Html.ActionLink("Next", "List", new { page = Model.CurrentPage + 1, sort = "Title", direction = "ASC" }) %>

<% foreach (SomeObject obj in Model.Items) { %>
    <!-- Display each item -->
<% } %>

答案 2 :(得分:0)

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

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,并添加现有的路由值。希望这会有所帮助。