2010-07-27 5 views
3

Я пытаюсь реализовать список подкачки и сортировки в ASP.NET MVC без использования сетки MVContrib или javascript (должен быть seo-friendly).Пейджинговая и сортировочная сетка в ASP.NET MVC

Я построил мое действие со следующей подписью:

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

Проблема я, хотя становится как пейджинг и сортировкой работать. Скажем, например, у меня есть следующий код:

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

Я надеялся, что это будет генерировать URL, содержащий все существующие значений маршрута (в том числе и на текущей странице), но это не так. Поэтому, когда вы нажимаете на ссылку, страница возвращается к нулевому значению.

Я рассмотрел все перегрузки для помощника ActionLink, но ничего похожего на это не поможет. То, что мне действительно нужно сделать, это создать url/link с существующим значением страницы (или, возможно, любым другим значением маршрута) и новыми параметрами сортировки.

Буду признателен, если кто-то может помочь. Благодарю.

+1

Каково ваше определение маршрутизации в Global.asax? Mayby вам просто нужно написать это лучше ... –

ответ

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); ваш список пунктов в настоящее время, так что вы не получили CurrentPage легко доступна. Если это так, то создать представление модель, которая содержит ваш список и текущую страницу. Например,

// 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 («Текст», новый {sort = "Email"})%> Он вернет ссылку на URL-адрес/Users/Index? Page = 1 & sort = Email. Я задумал создать свой собственный помощник, но маршрутизация для меня нова. – nfplee

Смежные вопросы