2013-01-18 12 views
10

Próbuję użyć select2 z ładowaniem ajax.select2 z metodą posta ajaxowego

Oto mój kod:

clonedTemplate.find('[id^=detailsPhaseFinanceMinor_]').select2({ 
    placeholder: "Select", 
    minimumInputLength: 1, 
    ajax: { // instead of writing the function to execute the request we use Select2's convenient helper 
     type: 'POST', 
     contentType: "application/json; charset=utf-8", 
     url: "mapBasic.aspx/GetFinSys", 
     dataType: 'json', 
     data: function (term, page) { 
      return "{'term':\"" + term + "\"}"; 
     }, 
     results: function (data, page) { // parse the results into the format expected by Select2. 
      // since we are using custom formatting functions we do not need to alter remote JSON data 
      return { results: data.Value }; 
     } 
    } 
}); 

Wywołanie ajax jest do WebMethod/pagemethod w kodzie opóźnieniem tej samej stronie:

[WebMethod] 
    public static List<LookupCodeItem> GetFinSys(string term) 
    { 
     string stringToCompareTo = term.ToLower(); 

     List<LookupCodeItem> result = new List<LookupCodeItem>(); 


     // FIN SYS 
     using (mapEntities db = new mapEntities()) 
     { 
      List<MPO_FINSYS_AMT> finSysCodes = (from x in db.MPO_FINSYS_AMT 
               select x).ToList(); 

      foreach (MPO_FINSYS_AMT item in finSysCodes) 
      { 
       string valKey = string.Format("{0}.{1}.{2}", item.FY, item.MDOT_MPO_CD, item.FIN_SYS); 
       LookupCodeItem x = new LookupCodeItem(); 
       x.Value = valKey; 
       x.ShortDescription = string.Format("{0}.{1}.{2}", item.FY, item.MDOT_MPO_CD, item.FIN_SYS); ; 
       x.LongDescription = string.Empty; 
       result.Add(x); 

      } 
     } 

     return result; 
    } 

Podczas wprowadzania danych do pola tekstowego, Żądanie POST jest wykonane, a json jest wysyłany, wydaje się być poprawnie sformatowany.

Jednak odpowiedź z pagemethod to cała strona html. Rozumiem, że może się to zdarzyć w przypadku metod post, jeśli nie ustawiłeś poprawnie "contentType" w wywołaniu ajax. Ustawiłem to tak samo, jak wszystkie inne wywołania ajaxowe, które działają na stronie (nie używają select2).

Czy select2 ignoruje atrybut "contentType"? Czy jest coś jeszcze, co zrobiłem niewłaściwie?

** EDIT ** Po wysłaniu tego, uważam, że ten problem opisany na stronie github select2 za: Issue 492 - Add Support for contentType to Ajax

Wydaje się, że to nie przejdzie contentType wskroś. Czy mogę ominąć plik selet2 wbudowany w helpera ajax i użyć własnego ręcznie zdefiniowanego?

Odpowiedz

-5

Proponuję użyć WebApi lub ServiceStack do połączeń danych zamiast [webmetod].

+0

To jest zalecenie, które należy umieścić w komentarzach, a nie w odpowiedzi. A także, w jaki sposób zmieniające się techniki programistyczne rzeczywiście mogłyby pomóc OP? – ilter

+0

Starałam się, aby plakat był łatwy do zasugerowania/obsługiwany sposób naprawy. Widząc, jak to było zrobione 7 miesięcy temu, niewiele mogę z tym teraz zrobić! :-) –

3

miałem ten sam problem i poniżej rozwiązanie działa dla mnie:

ajax: { 
    ... 
    params: { // extra parameters that will be passed to ajax 
     contentType: "application/json; charset=utf-8", 
    } 
    ... 
} 
1

Nie zapomnij dodać token CSRF do żądania POST. Możliwe, że robisz wszystko dobrze po stronie klienta, ale serwer odrzuca żądanie, ponieważ brakuje tokena. Zobacz na przykład dla PHP Laravel Framework: https://laravel.com/docs/5.4/csrf#csrf-x-csrf-token, aby uzyskać więcej informacji.