2010-07-27 53 views
3

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

我构建我用下面的签名行动:

ActionResult List(int? page, string sort, string direction); 

我虽然有越来越两个分页和排序问题的工作。例如说我有以下代码:

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

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

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

我会很感激,如果有人可以帮忙。谢谢。

+1

Global.asax中的路由定义是什么?梅比,你只需要写得更好... – 2010-07-27 16:58:20

回答

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))); 
    } 
} 

现在,所有你需要做的就是添加真在助手的结束和现有的路由值将增加。希望这可以帮助。

0

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

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

并用它来创建自己的。您可以在HTML帮助中访问信息,以获取有关当前请求(拉出当前的路由值,并与现有的结合他们的信息......

HTH。

0

你为什么不能指定在您的路由值页面如下?

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

我会大胆地猜测为ActionResult List(int? page, string sort, string direction);模型是你的产品清单目前,所以你没有得到当前是现成的。如果这样的话,创建一个视图包含你的列表和当前页面的模型,例如

// 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 --> 
<% } %> 
+0

谢谢,但是当我开始添加过滤器以及我可以这种方法成为一个痛苦的屈辱。我在创建自己的帮助器方法时会考虑更多,它会生成一个到现有url的链接,但也会覆盖手动传入的参数。比如说我在/ Users/Index?page = 1&sort = Name页面。然后,如果我提供了: <%= Html.ActionLink(“Text”,new {sort =“Email”})%> 它会返回链接到url/Users/Index?page = 1&sort = Email。我研究过建立自己的帮手,但路由对我来说是新的。 – nfplee 2010-07-28 09:20:12