2010-07-27 5 views
3

J'essaie d'implémenter une liste de pagination et de tri dans ASP.NET MVC sans utiliser la grille MVContrib ou javascript (doit être convivial).Grille de pagination et de tri dans ASP.NET MVC

J'ai construit mon action avec la signature suivante:

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

Le problème que j'ai bien est que vous avez la pagination et le tri au travail. Disons, par exemple, j'ai le code suivant:

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

J'espère que cela générerait une URL contenant toutes les valeurs de route existantes (y compris la page en cours) mais il ne fonctionne pas. Par conséquent, lorsque vous cliquez sur le lien, la page est définie sur null.

J'ai regardé toutes les surcharges pour l'aide ActionLink, mais rien ne semble que cela aidera. Ce que je dois effectivement faire est de générer un URL/lien avec la valeur de la page existante (ou potentiellement toutes les autres valeurs de route) et les nouveaux paramètres de tri.

J'apprécierais que quelqu'un puisse vous aider. Merci.

+1

Quelle est votre définition de routage dans Global.asax? Mayby vous avez juste besoin de mieux l'écrire ... –

Répondre

0

Problème résolu. J'ai réussi à trouver les méthodes d'extension suivantes:

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

Maintenant, tout ce que vous avez à faire est d'ajouter vrai à la fin de votre aide et les valeurs de route existantes seront ajoutés. J'espère que cela t'aides.

0

Vous auriez besoin d'écrire votre propre assistant html, ce qui est facile à faire. Pour ce faire, utilisez le format suivant:

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

Et l'utiliser pour créer votre propre. Vous pouvez accéder à l'information dans l'aide HTML pour obtenir des informations sur la requête en cours (pour tirer les valeurs actuelles de l'itinéraire et les combiner avec ceux qui existent déjà ...

HTH.

0

Pourquoi ne pouvez-vous préciser la page dans vos valeurs d'itinéraire comme suit?

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

Je hasarder une hypothèse que le modèle pour ActionResult List(int? page, string sort, string direction); est votre liste d'éléments actuellement, Si ce cas, créez une vue si vous n'avez pas currentPage facilement disponibles. modèle qui contient votre liste et la page en cours, par exemple

// 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

Merci, mais quand je commence à ajouter le filtrage ainsi je peux cette méthode devenir abit d'une douleur. Je pensais plus dans les lignes de créer ma propre méthode d'assistance qui génèrerait un lien vers l'URL existante mais aussi remplacerait les paramètres que je passe manuellement. Par exemple, disons que j'étais sur la page/Users/Index? Page = 1 & sort = Name. Alors si je fournis: <% = Html.ActionLink ("Texte", nouveau {sort = "Email"})%> Il retournerait un lien vers l'URL/Users/Index? Page = 1 & sort = Email. J'ai envisagé de construire mon propre assistant, mais le routage est nouveau pour moi. – nfplee

Questions connexes