2010-01-09 16 views
15

में एक तालिका को सॉर्ट करना मैं सोच रहा था कि लोग एएसपीनेट एमवीसी में एक टेबल को सॉर्ट करने के बारे में कैसे जा रहे थे? मैंने जावास्क्रिप्ट समाधानों के बारे में सुना है जो गैर-पेजेड टेबलों के साथ बहुत अच्छी तरह से काम करते हैं, जैसे कि jquery's table sorter, लेकिन मुझे एक ऐसे समाधान की आवश्यकता है जो पेजेड टेबल के साथ काम करेगी।एएसपीनेट एमवीसी

मैं जिस परियोजना पर काम कर रहा हूं वह वर्तमान में निम्न समाधान का उपयोग करता है, लेकिन मुझे यह बहुत गन्दा लगता है।

नियंत्रक

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

हेल्पर

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

सूची दृश्य

<%@ 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> 

इस घ के लिए एक ही रास्ता है इस तरह कुछ उबाऊ? यदि कोई व्यक्ति एक अच्छे तरीके से जानता है जिसमें किसी भी पृष्ठ को एक बार में लोड किए जाने वाले सभी रिकॉर्ड शामिल नहीं हैं तो कृपया उदाहरणों से लिंक करें।

+0

क्ष @AlteredConcept बहुत व्यापक है, कि में यू कह नहीं कर रहे हैं क्या यू के साथ सबसे अधिक चिंतित हैं। क्या यह दृश्य (शायद ही, इसकी सुंदर सरलता से), लिनक के साथ एक सामान्य तरीके से सॉर्ट करने का तरीका, पैरामीटर को पकड़ने के लिए सत्र का उपयोग, उस पैरामीटर जैसे "पैरामीटर" का उपयोग। – eglasius

+0

इसके बारे में क्षमा करें। नियंत्रक वास्तव में मुझे सबसे ज्यादा परेशान करता है। मैं प्रत्येक इकाई सूची दृश्य के लिए प्रत्येक नियंत्रक में उस कोड को दोहराना नहीं चाहता हूं। यह कोड का बहुत अधिक नकल है। मैं एक तरीका समझने की कोशिश कर रहा था कि मैं इसे मूल नियंत्रक में रख सकता हूं, लेकिन एक खाली चल रहा था। तो मैं यह देखने के लिए देख रहा था कि – AlteredConcept

+0

सॉर्ट करने के लिए दूसरों के पास एक अच्छा और अधिक सुरुचिपूर्ण दृष्टिकोण था। मेरे सर में दर्द है। –

उत्तर

0

मैं तरीकों यहाँ वर्णित पसंद करते हैं: पूर्व के लिए http://www.c-sharpcorner.com/UploadFile/camurphy/csharpLists03302006170209PM/csharpLists.aspx

तो: DataTables

var products = new List<Products>(); 
products = ProductRepository.GetAll(); 

// Sort Results 
products.Sort(
    delegate(Products p1, Products p2) { 
    return p1.Name.CompareTo(p2.Name); 
}); 
+0

क्या आपका मतलब 'p1.Name.CompareTo (p2.Name)'? –

10

चेक आउट @DataTables यह आपको पेज परिणाम है और आसान सेटअप के साथ क्वेरी करेगा। यह AJAX और जेसन डेटा के साथ अच्छी तरह से काम करता है। नमूने को देखो। उम्मीद है इससे आपकी सहायता होगी।

static class OrderByExtender 
{ 
    public static IOrderedEnumerable<T> OrderBy<T>(this IEnumerable<T> collection, string key, string direction) 
    { 
     LambdaExpression sortLambda = BuildLambda<T>(key); 

     if(direction.ToUpper() == "ASC") 
      return collection.OrderBy((Func<T, object>)sortLambda.Compile()); 
     else 
      return collection.OrderByDescending((Func<T, object>)sortLambda.Compile()); 
    } 

    public static IOrderedEnumerable<T> ThenBy<T>(this IOrderedEnumerable<T> collection, string key, string direction) 
    { 
     LambdaExpression sortLambda = BuildLambda<T>(key); 

     if (direction.ToUpper() == "ASC") 
      return collection.ThenBy((Func<T, object>)sortLambda.Compile()); 
     else 
      return collection.ThenByDescending((Func<T, object>)sortLambda.Compile()); 
    } 

    private static LambdaExpression BuildLambda<T>(string key) 
    { 
     ParameterExpression TParameterExpression = Expression.Parameter(typeof(T), "p"); 
     LambdaExpression sortLambda = Expression.Lambda(Expression.Convert(Expression.Property(TParameterExpression, key), typeof(object)), TParameterExpression); 
     return sortLambda; 
    } 
} 

उपयोग::

var products = Session["Model"] as IEnumerable<Product>() ?? _service.GetAll(); 

return products.OrderBy("Name", "ASC").ThenBy("Price", "DESC"); 

आप यह मानते हुए एक बार में केवल 1 orderby हालत उपयोग कर रहे हैं आप का उपयोग कर सकते हैं:

+0

+1। मैंने सर्वर-साइड प्रसंस्करण (http://datatables.net/usage/server-side) के साथ ASP.NET MVC अनुप्रयोग में डेटाटेबल्स jQuery प्लगइन का सफलतापूर्वक उपयोग किया है। –

+2

यह लोड पर पृष्ठ पर मौजूद सभी डेटा लोड करता है (भले ही यह लोड होने के बाद डेटा को पेज करता हो)। एक बार में 1000+ रिकॉर्ड लोड करने का प्रयास करें। पेज प्रदर्शित होने में कुछ समय लगता है। – AlteredConcept

+1

क्लाइंट को दिखाए गए पंक्तियों को भेजने के लिए सर्वर-साइड प्रसंस्करण का उपयोग करें http://datatables.net/usage/server-side, जैसा कि एंटोन ने इंगित किया था। –

7

(सिर के ऊपर से) निम्न एक्सटेंशन तरीकों का प्रयास करें

var products = Session["Model"] as IEnumerable<Product>(); 

var sortDirection = Session["Direction"] as string ?? "DESC"; 
Session["Direction"] = sortDirection == "DESC" ? "ASC" : "DESC"; 
sortDirection = Session["Direction"] as string; 

return products.OrderBy(parameter, sortDirection); 
+0

दिशा नहीं चाहिए। कमर() दिशा हो। ToUpper()? – AlteredConcept

+0

सही। यह इंगित करने के लिए धन्यवाद, मैंने नोटपैड में यह सामान लिखा :-) –

+0

कोई समस्या नहीं। मुझे यह दृष्टिकोण पसंद है, लेकिन मैं इसके साथ कुछ मुद्दों में भाग रहा हूं। कभी-कभी यह सही ढंग से व्यवस्थित होता है और अन्य बार यह नहीं होता है (आरोही के बजाय यह अवरोही और इसके विपरीत होता है)। – AlteredConcept

4

यदि जावास्क्रिप्ट अक्षम है, तो आपको एक समस्या है।

मैं नोस्क्रिप्ट समाधान के लिए जाऊंगा।

मैं होगा दो रेडियो बटन समूहों: (जावास्क्रिप्ट) के बिना एक ही नाम

~~:

direction: () ascending (.) descending 

orderBy: (.) Id () Name () Status 

मैं देखें एक रूप के रूप में कई प्रस्तुत बटन के साथ इलाज चाहते हैं दोनों बटन के लिए।

आपके।

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Sort(string direction, string orderBy, string submitButton) 
{ 
    if (submitButton == "Requery")  //et cetera 

TMTOWTDI: अपने नियंत्रक में

<input type="submit" value="Requery" name="submitButton"/> 
<input type="submit" value="Previous" name="submitButton"/> 
<input type="submit" value="Next"  name="submitButton"/> 

: aspx पेज, तीन बटन जोड़ने वहाँ एक से अधिक तरीका यह

0

करने के लिए निश्चित रूप से पसंद जनवरी के समाधान है - धन्यवाद एक बहुत जनवरी ... आपने मुझे कॉलम हेडर के प्रत्येक पार्सिंग के मामले में कोड के कुछ 60 लाइनों को बचाया है। समाधान "एक महान टॉगल क्लिक करता है, केवल टेबल पर 1 कॉलम समाधान द्वारा क्रमबद्ध करें", जब दो सत्र चर के साथ प्रयोग किया जाता है, एक एएससी/डीईएससी को बुलियन के रूप में बनाए रखने के लिए और एक प्रकार/कॉलम नाम रखने के लिए।

मैंने इस सी # उदाहरण एक्सटेंशन का उपयोग किया और इसे आज दोपहर वीबी के साथ लागू किया। मैं कोड की एक पंक्ति में 30 लाइन केस स्टेटमेंट काटने में कामयाब रहा।

देख रहे हों:

<th>Date <a class="clickable" href="<%=Url.Action("SortStationVisits", New With {.SortField = "PlanningDate"})%>"><span class="colSort" style="display: inline-table;"></span></a></th> 

विस्तार (सार्वजनिक मॉड्यूल OrderByExtender):

Imports System.Linq.Expressions 

Public Function OrderBy(Of T)(collection As IEnumerable(Of T), key As String, isDescending As Boolean) As IOrderedEnumerable(Of T) 
    Dim sortLambda As LambdaExpression = BuildLambda(Of T)(key) 
    If isDescending Then 
     Return collection.OrderByDescending(DirectCast(sortLambda.Compile(), Func(Of T, Object))) 
    Else 
     Return collection.OrderBy(DirectCast(sortLambda.Compile(), Func(Of T, Object))) 
    End If 
End Function 

Public Function ThenBy(Of T)(collection As IOrderedEnumerable(Of T), key As String, isDescending As Boolean) As IOrderedEnumerable(Of T) 
    Dim sortLambda As LambdaExpression = BuildLambda(Of T)(key) 

    If (isDescending) Then 
     Return collection.ThenByDescending(DirectCast(sortLambda.Compile(), Func(Of T, Object))) 
    Else 
     Return collection.ThenBy(DirectCast(sortLambda.Compile(), Func(Of T, Object))) 
    End If 
End Function 

Private Function BuildLambda(Of T)(key As String) As LambdaExpression 
    Dim TParameterExpression As ParameterExpression = Expression.Parameter(GetType(T), "p") 
    Dim sortLambda As LambdaExpression = Expression.Lambda(Expression.Convert(Expression.[Property](TParameterExpression, key), GetType(Object)), TParameterExpression) 
    Return sortLambda 
End Function 

नियंत्रक कार्रवाई एटी:

Public Function SortStationVisits(Optional page As Integer = 1, Optional SortField As String = "") As ActionResult 
    Dim sps = LoadSession() 

    If SortField = sps.StationVisitSorter Then 
     sps.StationVisitDescOrder = Not (sps.StationVisitDescOrder) 
    Else 
     sps.StationVisitDescOrder = False 
    End If 

    sps.StationVisitSorter = SortField 

    SaveSession(sps) 
    Return RedirectToAction("Show") 
End Function 

नियंत्रक शो विधि एटी (कोड w00t की 1 लाइन!):

spv.SelectableStationVisits = spv.SelectableStationVisits.OrderBy(sps.StationVisitSorter, sps.StationVisitDescOrder).ToList