6

अपने पन्ने पर मेरे पास है:मॉडल पेजर में पोस्टबैक के बाद रिक्त है

  • एक 'फिल्टर' अनुभाग - चेक बॉक्स और बक्सें की एक जोड़ी,
  • एक 'खोज' बटन, पेजिंग साथ
  • ग्रिड जहां परिणाम प्रदर्शित होते हैं। ग्रिड टेलीरिक से है (http://demos.telerik.com/aspnet-mvc/grid/index1), लेकिन मुझे यह नहीं लगता कि यह मायने रखता है।

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

पेजिंग ठीक काम करता है केवल अगर मैं इसका इस्तेमाल जब पेज लोड (कि इससे पहले कि मैं खोज बटन क्लिक करें का मतलब है, इस मामले यूआरएल है '... होम' में)।

लेकिन यदि पहले खोज पर क्लिक करें (इस मामले में यूआरएल '... होम/सर्च' बन जाएगा) और फिर ग्रिड पर किसी अन्य पेज पर जाने का प्रयास करें तो मुझे खोज विधि में अपवाद मिलता है, क्योंकि मॉडल .फिल्टर पैरामीटर शून्य है (System.NullReferenceException: ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट के उदाहरण पर सेट नहीं है।)

मैंने कई अलग-अलग तरीकों से समस्या को हल करने का प्रयास किया (RedirectToAction विधि के साथ, सत्र में फ़िल्टर संग्रहीत करना और इसका उपयोग करना खोज विधि, ...) लेकिन सभी परिदृश्यों में कोई समाधान काम नहीं किया। कोई विचार?

मेरे सरलीकृत कोड:

HomeController:

public ActionResult Index() 
{ 
    // On page load display all data without filters. 
    var filter = new OverviewFilterModel 
    { 
     Type1 = true, 
     Type2 = true, 
     WorkingOrder = "" 
    }; 
    ViewBag.Results = GetResults(filter); 
    return View(new HomeModel { Filter = filter }); 
} 

public ActionResult Search(HomeModel model) 
{ 
    ViewBag.Results = GetResults(model.Filter); 
    return View("Index"); 
} 

public class OverviewFilterModel 
{ 
    public bool Type1 { get; set; } 
    public bool Type2 { get; set; } 
    public string WorkingOrder { get; set; } 
} 

public class HomeModel 
{ 
    public OverviewFilterModel Filter { get; set; } 
    public IEnumerable<OverviewResultsModel> Results { get; set; } 
} 

दृश्य:

<!-- ... --> 
@model HomeModel 
<!-- ... --> 

@using (Html.BeginForm("Search", "Home", FormMethod.Post, new { @class = "form-inline" })) 
{ 
    <div class="form-group" style="margin-left: 135px;"> 
     @Html.CheckBoxFor(p => p.Filter.Type1)@Html.LabelFor(p => p.Filter.Type1, new { style = "margin: 0 15px 0 5px;" }) 
    </div> 
    <!-- a bunch of other checkboxes --> 
    <br /> 
    <div class="form-group"> 
     <label style="width: 130px; text-align: right;">Delovni nalog</label> 
     @Html.TextBoxFor(p => p.Filter.WorkingOrder, new { @class = "form-control ecert-filter-small", @autocomplete = "off" }) 
    </div> 
    <!-- a bunch of other textboxes --> 
    <button class="k-button" id="button-refresh" style="margin: 10px 0 0 135px;">Refresh</button> 
    <hr /> 
    @(Html.Kendo().Grid<OverviewResultsModel>() 
     .BindTo((IEnumerable<OverviewResultsModel>)ViewBag.Results) 
     .Name("gridOverview") 
     .Events(p => p.Change("overviewOnRowSelect")) 
     .Columns(columns => 
     { 
      columns.Template(@<text>@Html.ActionLink("WorkingOrder", "Index", "WO", new { dn = @item.WorkingOrder }, new { @class = "selectable-dn" })</text>).Title(""); 
      columns.Bound(p => p.Type); 
      columns.Bound(p => p.WorkingOrder); 
      columns.Bound(p => p.Date); 
      columns.Bound(p => p.ProductId); 
      columns.Bound(p => p.ProductName); 
     }) 
     .Selectable() 
     .Pageable(p => p 
      .Refresh(true) 
      .PageSizes(true) 
      .ButtonCount(10) 
      .Messages(q => 
      { 
       q.Display("{0} - {1} od {2} records"); 
       q.Empty("No data for selected filter"); 
       q.ItemsPerPage("Number of records per page"); 
      }) 
     ) 
     .DataSource(p => p.Server().PageSize(20).Model(q => { q.Id(r => r.WorkingOrder); })) 
    ) 
} 
+1

शायद तुम आप मॉडल की जाँच करनी चाहिए, और अगर यह अशक्त है, इस संभाल। इसके अलावा, मैं समझ नहीं पा रहा हूं, आपकी 'इंडेक्स' विधि में 'फ़िल्टर' चर परिभाषित कहां है? यदि आपको कुछ पृष्ठों के माध्यम से कुछ डेटा का उपयोग करने की आवश्यकता है, तो मैं आपको 'व्यूबैग' के बजाय 'टेम्पडडेटा' का उपयोग करने की सलाह दूंगा। –

+0

मैंने अपना प्रश्न संपादित किया - इंडेक्स विधि (जब पृष्ठ लोड होता है) में फ़िल्टर खाली होता है इसलिए सभी डेटा प्रदर्शित किए जाने चाहिए। मैंने होममोडेल क्लास भी जोड़ा जो व्यू (@ मॉडल होममोडेल) में उपयोग किया जाता है। – sventevit

उत्तर

3

मैंने इसे सत्र वस्तुओं की मदद से हल किया - एक फ़िल्टर के लिए और एक परिणाम के लिए। सबसे सुरुचिपूर्ण समाधान नहीं है लेकिन यह काम करता है।

public ActionResult Index() 
{ 
    // On page load display all data without filters. 
    OverviewFilterModel filter; 
    if (Session["filter"] == null) { 
     var filter = new OverviewFilterModel 
     { 
      Type1 = true, 
      Type2 = true, 
      WorkingOrder = "" 
     }; 
    } 
    else { 
     filter = (OverviewFilterModel)Session["filter"]; 
    } 

    if (Session["results"] == null){ 
     ViewBag.Results = GetResults(filter); 
    } 
    else{ 
     ViewBag.Results = Session["results"]; 
    } 

    return View(new HomeModel { Filter = filter }); 
} 

public ActionResult Search(HomeModel model) 
{ 
    if (model.Filter == null) 
    { 
     model.Filter = (OverviewFilterModel)Session["filter"]; 
    } 

    ViewBag.Results = GetResults(model.Filter); 
    return View("Index"); 
} 

private IEnumerable<OverviewResultModel> GetResults(OverviewFilterModel filter){ 
    var data = ... 

    Session["results"] = data; 
    Session["filter"] = filter; 

    return data; 
} 
2

शायद इस तरह से GetResults(model.Filter) निष्पादित करने से पहले खोजें विधि में HomeModel.Filter के हत्थे शून्य मान द्वारा मदद करता है:

public ActionResult Search(HomeModel model) 
{ 
    if (model.Filter == null) 
    { 
     model.Filter = new OverviewFilterModel 
     { 
      Type1 = true, 
      Type2 = true, 
      WorkingOrder = "" 
     }; 
    } 
    ViewBag.Results = GetResults(model.Filter); 
    return View("Index", new HomeModel { Filter = filter }); 
} 

मुझे लगा कि एनआरई, सीएमआईआईडब्ल्यू को रोकने के लिए शून्य स्थिति को एक शर्त द्वारा संभाला जाना चाहिए।

+0

यह ठीक नहीं है क्योंकि इस मामले में मैंने फ़िल्टर के बारे में जानकारी खो दी है। तो उदाहरण के लिए मैं फ़िल्टर अनुभाग में एक चेकबॉक्स का चयन करता हूं और खोज पर क्लिक करता हूं। सही डेटा प्रदर्शित होता है। लेकिन फिर मैं ग्रिड पेजर पर पेज 2 पर क्लिक करता हूं और दूसरा पृष्ठ सभी डेटा के लिए प्रदर्शित होता है क्योंकि फ़िल्टर के लिए मूल डेटा खो जाता है। – sventevit

+0

तो, आपको कुकीज़ में अपने फ़िल्टर को स्टोर करने की आवश्यकता है, फिर इसे पुनर्प्राप्त करें। –

संबंधित मुद्दे