Tri d'une table dans asp.net MVC
Je me demandais comment les gens allaient sur le tri d'un tableau dans asp.net mvc?
J'ai entendu parler de javascript solutions qui fonctionnent assez bien avec la non-paginé tables, telles que jquery table du trieur, mais j'ai besoin d'une solution qui fonctionne avec paginé tables.
Le projet, je travaille sur utilise actuellement la solution suivante, mais je trouve qu'il est très salissant.
Contrôleur
public ActionResult Sort(string parameter)
{
IEnumerable<IProduct> list;
if (Session["Model"] != null)
list = (IEnumerable<IProduct>)Session["Model"]).ToList<IProduct>();
else
list = _service.GetAll();
if (Session["parameter"] == null && Session["sortDirection"] == null)
{
//set the parameter and set the sort to desc
Session["parameter"] = parameter;
Session["sortDirection"] = "DESC";
}
else if (Session["parameter"] != null) //already set so not the first time
{
//same parameter sent
if (Session["parameter"].ToString().Equals(parameter))
{
//check sort direction and reverse
if (Session["sortDirection"].ToString().Equals("DESC"))
Session["sortDirection"] = "ASC";
else
Session["sortDirection"] = "DESC";
}
else //different parameter sent
{
Session["sortDirection"] = "DESC";
Session["parameter"] = parameter;
}
}
if (Session["sortDirection"].CompareTo("ASC") == 0)
list = Models.ContollerHelpers.SortingHelper.OrderBy(list.AsQueryable(), column);
else
list = Models.ContollerHelpers.SortingHelper.OrderByDescending(list.AsQueryable(), column);
return View("Results", list.ToList);
}
Helper
public class Helper()
{
private static IOrderedQueryable<T> OrderingHelper<T>(IQueryable<T> source, string propertyName, bool descending, bool anotherLevel)
{
ParameterExpression param = Expression.Parameter(typeof(T), string.Empty); //I don't care about some naming
MemberExpression property = Expression.PropertyOrField(param, propertyName);
LambdaExpression sort = Expression.Lambda(property, param);
MethodCallExpression call = Expression.Call(
typeof(Queryable),
(!anotherLevel ? "OrderBy" : "ThenBy") + (descending ? "Descending" : string.Empty),
new[] { typeof(T), property.Type },
source.Expression,
Expression.Quote(sort));
return (IOrderedQueryable<T>)source.Provider.CreateQuery<T>(call);
}
public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string propertyName)
{
return OrderingHelper(source, propertyName, false, false);
}
public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> source, string propertyName)
{
return OrderingHelper(source, propertyName, true, false);
}
public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> source, string propertyName)
{
return OrderingHelper(source, propertyName, false, true);
}
public static IOrderedQueryable<T> ThenByDescending<T>(this IOrderedQueryable<T> source, string propertyName)
{
return OrderingHelper(source, propertyName, true, true);
}
}
Affichage De La Liste
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Models.Interface.IProduct>>" %>
<% Session["model"] = Model; %>
<table>
<tr>
<th>
Edit Details
</th>
<th>
<%=Html.ActionLink("Id","Sort",new {parameter ="Id"}) %>
</th>
<th>
<%=Html.ActionLink("Name", "Sort", new { parameter = "Name"})%>
</th>
<th>
<%=Html.ActionLink("Status", "Sort", new { parameter = "Status" })%>
</th>
<th>
<%=Html.ActionLink("Notes", "Sort", new { parameter = "Notes"})%>
</th>
</tr>
<% foreach (var item in Model){ %>
<tr>
<td>
<%= Html.ActionLink("Edit", "Edit", new { id=item.Id }) %> |
</td>
<td>
<%= Html.Encode(item.Id) %>
</td>
<td>
<%= Html.Encode(item.Name) %>
</td>
<td>
<%= Html.Encode(item.Status) %>
</td>
<td>
<%= Html.Encode(item.Notes) %>
</td>
</tr>
<% } %>
</table>
Est-ce la seule manière de faire quelque chose de ce genre?
Si quelqu'un sait d'une plus belle manière qui n'implique pas d'avoir tous les documents en cours de chargement d'une page à la fois, puis s'il vous plaît lien vers des exemples.
source d'informationauteur AlteredConcept
Vous devez vous connecter pour publier un commentaire.
Découvrez les tables de données @ DataTables Cela vous permettra de la page du résultat et de l'interroger avec une installation facile. il fonctionne bien avec l'ajax et json de données. Regardez les échantillons. Espérons que cela va vous aider.
Essayez ce qui suit les méthodes d'extension (à partir du haut de la tête):
Utilisation:
En supposant que vous êtes seulement en utilisant 1 orderby condition à la fois, vous pouvez utiliser:
Si JavaScript est désactivé, vous avez un problème.
J'irais pour un noscript solution.
J'aurais bouton radio deux groupes:
J'aimerais traiter le Vue comme un forme avec plusieurs boutons de soumission:
(sans JavaScript) ~~ même nom pour les deux boutons.
sur votre .page aspx, ajoutez trois boutons:
dans votre Contrôleur:
TMTOWTDI: Il n'y a Plus d'Une Façon De Faire
Je préfère les méthodes décrites ici:
http://www.c-sharpcorner.com/UploadFile/camurphy/csharpLists03302006170209PM/csharpLists.aspx
Donc, pour ex:
Certainement aimer Jan solution - merci beaucoup Jan... Vous juste m'a sauvé environ 60 lignes de code avec un cas d'analyse de l'instruction de chacun des en-têtes de colonne. La solution "fait une grande bascule clic, seul trier par colonne 1 de la solution sur les tables", lorsqu'il est utilisé avec deux variables de session, un à conserver l'ASC/DESC comme une valeur booléenne et une pour tenir le Type/Nom de la Colonne.
J'ai utilisé cet Exemple en C# Extension et mis en oeuvre avec VB cet après-midi. J'ai réussi à couper un 30 ligne d'instruction de cas en une seule ligne de code.
À LA VUE:
L'EXTENSION (Module Public OrderByExtender):
À L'ACTION DE CONTRÔLEUR:
AU CONTRÔLEUR de la MÉTHODE SHOW (1 ligne de code W00T!) :