2012-04-07 16 views
13

में फ़िल्टरिंग मैंने एक वेबग्रिड लागू किया है। छंटनी, पेजिंग और फ़िल्टरिंग एक साथ काम नहीं करते हैं। जब आप अकेले उनका उपयोग करते हैं तो वे काम करते हैं। जब आप तीनों को गठबंधन करते हैं, उसी समय फ़िल्टरिंग काम नहीं करती है।वेबग्रिड + पेजिंग + सॉर्टिंग + फ़िल्टरिंग में खो रहा है .NET 4.0

लक्षण:
परिणाम फ़िल्टर करें, फिर सॉर्ट करें।

या

परिणामसेट फ़िल्टर करें, फिर अगले पृष्ठ पर जाएं।

दोनों मामलों में, फ़िल्टर खो गया है। लेकिन यह पेज और सॉर्ट करता है।

पीछे कोड में: जब क्रिया विधि को सॉर्ट या पेजिनेशन के माध्यम से बुलाया जाता है, तो प्रत्येक फ़िल्टर पैरामीटर के लिए नल दिखाते हैं।

जब फ़िल्टर विधि के माध्यम से क्रिया विधि कहा जाता है, तो फ़िल्टर पैरामीटर आते हैं।

यह मुझे बताता है कि जब आप एक प्रकार या अंकन शुरू करते हैं कि यह फ़ॉर्म सबमिट नहीं कर रहा है।

public ActionResult MyPage(int? page, int? rowsPerPage, 
       string sort, string sortdir, 
       string orderNumber, string person, string product) 

मैंने एसओ और अन्य जगहों पर चारों ओर देखा है। बहुत से उदाहरण हैं और लोग पूछ रहे हैं कि एक या दूसरे या तीनों को कैसे करना है। लेकिन मैंने केवल one with my issue देखा है, इसलिए मैं इसे यहां पोस्ट कर रहा हूं। (अपने रूप में अच्छी तरह अनसुलझी था)

मैं अपने पृष्ठ के रूप में लागू कर दिया है इस प्रकार है:

@using (Ajax.BeginForm("MyPage", null, new AjaxOptions { InsertionMode = InsertionMode.Replace, UpdateTargetId = "myGrid" }, new { id = "filter" })) 
{ 
    <div class="right"> 
     <select id="rowsPerPage" name="rowsPerPage"> 
      <option>15</option> 
      <option>25</option> 
      <option>50</option> 
      <option>75</option> 
      <option>100</option> 
     </select> 
    </div> 

    <div class="table"> 
     <div class="tableRow"> 
      <div class="tableCell"> 
       Order Number 
      </div> 
      <div class="tableCell"> 
       Person 
      </div> 
      <div class="tableCell"> 
       Product 
      </div> 
     </div> 
     <div class="tableRow"> 
      <div class="tableCell"> 
       <input type="text" id="orderNumber" name="orderNumber" /> 
      </div> 
      <div class="tableCell"> 
       <input type="text" id="person" name="person" /> 
      </div> 
      <div class="tableCell"> 
       <input type="text" id="product" name="product" /> 
      </div>   
      <div class="tableCell"> 
       <input type="submit" class="button" value="Search" /> 
      </div> 
     </div> 
    </div> 

<br/> 

<div id="myGrid"> 
    @Html.Partial("_MyPage", Model) 
</div> 

} 

ग्रिड इस तरह की एक आंशिक दृश्य के रूप में कार्यान्वित किया जाता है:

<script type="text/javascript"> 
    $(document).ready(function() { 
     resetUI(); 
    }); 
</script> 

@{ 
    var grid = new WebGrid(canPage: true, rowsPerPage: Model.rowsPerPage, canSort: true, ajaxUpdateContainerId: "grid", ajaxUpdateCallback: "resetUI"); 
    grid.Bind(Model.rows, rowCount: Model.TotalRecords, autoSortAndPage: false); 
    @grid.GetHtml(
     tableStyle: "fancyTable", 
     headerStyle: "header", 
     footerStyle: "footer", 
     rowStyle: "row", 
     alternatingRowStyle: "alt", 
     mode: WebGridPagerModes.Numeric | WebGridPagerModes.NextPrevious, 
     nextText: "Next", 
     previousText: "Previous", 
     htmlAttributes: new { id = "grid" }, 
     columns: grid.Columns(
      grid.Column("OrderDate", "Order Date", format: @<text>@((item.OrderDate != null) && (item.OrderDate.ToString("MM/dd/yyyy") != "01/01/0001") ? item.OrderDate.ToString("MM/dd/yyyy") : "")</text>), 
      grid.Column("OrderNumber", "Order Number"), 
      grid.Column("Field1, "Field 1"), 
      grid.Column("Field2", "Field 2"), 
      grid.Column("Person", "Person"), 
      grid.Column("Product", "Product"), 
      grid.Column(format: (item) => Html.ActionLink("View", "Details", new { id = item.orderNumber })) 
      ) 
     ); 
} 
+0

क्या आपको इसके लिए समाधान मिला? – RredCat

+0

ध्यान रखें कि एएसपीएनटी एमवीसी चेकबॉक्स के लिए अतिरिक्त छिपे हुए इनपुट तत्व बनाएगा और वेबग्रिड इन 2 तत्वों को दोबारा परिभाषित करने के लिए प्रतीत होता है यदि एक तत्व में 2 मानों के साथ क्वेरीस्ट्रिंग में मौजूद है, जो मॉडल के मामले में रेजर में पार्सिंग समस्याएं पैदा कर सकता है चेकबॉक्स के माध्यम से एक चेकबॉक्स के लिए बाध्य। मुझे क्लाइंट साइड पर इन छिपे हुए फ़ील्ड को हटाने के लिए jQuery का उपयोग करना पड़ा। –

उत्तर

22

जब पृष्ठांकन निर्माण और प्रकार लिंक, वेबग्रिड सहायक खाते में क्वेरी स्ट्रिंग पैरामीटर वर्तमान यूआरएल में मौजूद है। यह पोस्ट और मार्ग मूल्यों को अनदेखा करता है। और चूंकि आपके खोज फ़ॉर्म POSTs, इस फ़ॉर्म में उपयोगकर्ता द्वारा दर्ज किए गए मान क्वेरी स्ट्रिंग में मौजूद नहीं हैं, इसलिए वे पेजिनेशन और सॉर्ट लिंक का हिस्सा नहीं हैं और जब आप उन लिंक में से किसी एक पर क्लिक करते हैं तो मान हैं खो गया। यह डिजाइन द्वारा है। प्राप्त क्रिया का उपयोग कर एक मानक HTML फार्म के साथ

@using (Ajax.BeginForm("MyPage", null, new AjaxOptions { InsertionMode = InsertionMode.Replace, UpdateTargetId = "myGrid" }, new { id = "filter" })) 

:

@using (Html.BeginForm("MyPage", null, FormMethod.Get)) 

या एक AJAX के प्रपत्र प्राप्त क्रिया का उपयोग करते हुए:

तो एक ही रास्ता है कि ठीक करने के लिए अपने AjaxForm को बदलने के लिए है

@using (Ajax.BeginForm("MyPage", null, new AjaxOptions { HttpMethod = "Get", InsertionMode = InsertionMode.Replace, UpdateTargetId = "myGrid" }, new { id = "filter" })) 

अब, जब उपयोगकर्ता कुछ फ़िल्टर करना चाहता है और खोज सबमिट बटन को हिट करता है तो वह दर्ज करता है खोज फ़ॉर्म में एड क्वेरी स्ट्रिंग में समाप्त हो जाएगा और वेबग्रिड हेल्पर को प्रतिपादित करने पर उनका उपयोग सॉर्ट और पेज लिंक उत्पन्न करने के लिए होगा और निश्चित रूप से जब आप उन लिंक पर क्लिक करेंगे तो मान सर्वर पर भेजे जाएंगे।

यदि आप इस पर अधिक नियंत्रण चाहते हैं तो आप MvcContrib.Grid या Telerik Grid for ASP.NET MVC जैसे अधिक उन्नत ग्रिड नियंत्रणों पर विचार कर सकते हैं।

+0

यह 'Ajax.BeginForm' के साथ 'नए AjaxOptions {HttpMethod =" Get "का उपयोग करके GET के साथ भी काम करेगा, ...' – nemesv

+0

नहीं, मुझे नहीं लगता कि यह काम करेगा (हालांकि मैंने इसका परीक्षण नहीं किया है और मैं शायद गलत हो)। जब आप एक AJAX अनुरोध करते हैं (कोई फर्क नहीं पड़ता कि यह प्राप्त या पोस्ट है) आप वर्तमान यूआरएल को संशोधित नहीं कर रहे हैं। –

+0

यह AJAX के साथ भी काम करेगा (मैंने इसका परीक्षण किया है :)), 'वेबग्रिड' आंतरिक रूप से 'Request.QueryString' का उपयोग करता है ताकि पेजर के मानों को पारित किया जा सके और AJAX अनुरोधों में भी पॉप्युलेट किए गए लिंक को सॉर्ट किया जा सके। – nemesv

1

यूआरएल कि पेजिंग लिंक अंक के लिए करने के लिए प्रपत्र जमा करें:, जब भी एक तरह से या पेजिंग

<script type="text/javascript"> 
    $(function() { 
     $('th a, tfoot a').click(function() { 
      $('form').attr('action', $(this).attr('href')).submit(); 
      return false; 
     }); 
    }); 
</script> 

यह मेरी मदद लेकिन आप

1

बस अपने कार्रवाई विधि के लिए एक प्राप्त बनाने में मदद कर सकता है doesnot ग्रिड से आग यह कई पैरामीटर के साथ जीईटी विधि को हिट करती है (आप अपने ब्राउज़र के वेब डेवलपर टूल का उपयोग करके पेजिंग नंबर या ग्रिड के सॉर्ट हेडर को इंगित करके देख सकते हैं), वहां आप अपना डेटासेट फ़िल्टर कर सकते हैं और फिर पास कर सकते हैं दृश्य के लिए मॉडल:

[HttpGet] 
public ActionResult MyPage() 

हर बार जब आप इस विधि को सॉर्ट या पेजिंग करते हैं तो हिट किया जाएगा, फिर आप अपनी फ़िल्टरिंग कर सकते हैं, आप कुछ स्थिर झंडे जोड़ सकते हैं जिन्हें आप फ़िल्टर करना चाहते हैं उसके आधार पर असाइन किया जा सकता है।