2017-02-16 36 views
15

Przeczytałem wiele postów z tym samym problemem, ale nic nie pomogło, więc przepraszam za duplikat pytania :(Podążałem za prostym przykładem na stronie JQueryUI twardymi wartościami kodowania i autouzupełniania działa , ale muszę go pochodzą z mojej bazy danychAutouzupełnianie JQuery UI nie osiąga ActionResult C# MVC

Zobacz:.

@Html.TextBoxFor(model => model.Position, new { @type = "text", @id = "jobtitle", @name = "jobtitle", @placeholder = "Job Title" }) 

JS:

EDIT: dodałem alert w przypadku sukcesu, a alarm jest powołanych, lecz nie to nie jest dat a (tj. Brak danych są pobierane z DB)

<script> 
$(function() { 
      $("#jobtitle").autocomplete({ 
       source: function (request, response) { 
        $.ajax({ 
         url: '@Url.Action("JobsAutoFill", "Account")', 
         data: { 
          Prefix: request.term 
         }, 
         success: function (data) { 
          alert(data); 
          response(data); 
         } 
        }); 
       }, 
       minLength: 1 
      }); 

      //$("#jobtitle").autocomplete({ 
      // source: "/Account/JobsAutoFill/" 
      //}); 
     }); 
</script> 

I dodałem linki wymagane:

<script src="https://code.jquery.com/jquery-1.12.4.js"></script> 
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> 

Poniżej jest moje ActionResult (właściwie JsonResult) & Funkcja ciągnąć listę zadań:

public List<Jobs> GetAllJobs() 
    { 
     List<Jobs> JobsList = new List<Jobs>(); 

     using (RBotEntities EF = new RBotEntities()) 
     { 
      var JobsListQuery = (from ED in EF.EmploymentDetails 
            select new 
            { 
             ED.pkiEmploymentDetailID, 
             ED.Position 
            }); 

      foreach (var item in JobsListQuery) 
      { 
       JobsList.Add(new Jobs 
       { 
        Id = item.pkiEmploymentDetailID, 
        Name = item.Position 
       }); 
      } 
     } 

     return JobsList; 
    } 

public JsonResult JobsAutoFill(string Prefix) 
     { 
      //Note : you can bind same list from database 


      List<Jobs> ObjList = new List<Jobs>(); 

      ObjList = GetAllJobs(); 

      //Searching records from list using LINQ query 


      var JobNames = (from N in ObjList 
          where N.Name.StartsWith(Prefix) 
          select new { N.Name }); 
      return Json(JobNames, JsonRequestBehavior.AllowGet); 
     } 

Czy brakuje mi czegoś lub robię coś nie tak?

Doceniam każdą pomoc, dzięki!

+0

Ktoś może pomóc? – AxleWack

+1

Zignoruj ​​jquery na teraz. Jest to metoda GET. Spróbuj uzyskać do niej dostęp z przeglądarki internetowej. Czy to działa? Czy możliwe jest serializowanie zadań? Czy możesz trafić punkt przerwania na serwerze? Co znajduje się wewnątrz obiektu "data"? Wypróbuj również dane. Data –

+0

Udało mi się teraz skontaktować z Kontrolerem i zobaczyć, że Zadania są zwracane, ale teraz to się nie pokazuje (widzę tylko małe okienko z wyskakującymi okienkami bez tekstu). Próbowałem data.Data i powiedział nieokreślony. – AxleWack

Odpowiedz

13

Mam to działa!

Pierwszą rzeczą, która spowodowała problem było to, że musiałem dodać [AllowAnonymous] powyżej mojego ActionResult.

Po drugie, zmienił moje wezwanie Ajax do tego:

$(function() { 
    $("#jobtitle").autocomplete({ 
     source: function (request, response) { 
      $.ajax({ 
       url: '@Url.Action("JobsAutoFill", "Account")', 
       data: { 
        Prefix: request.term 
       }, 
       success: function (data) { 
        response($.map(data, function (obj) { 
         return { 
          label: obj.Name, 
          value: obj.Name 
         }; 
        })); 
       } 
      }); 
     }, 
     minLength: 1 
    }); 
}); 

Poniżej jest moje ActionResult. I dodaje, że zmiana będzie uporządkować czułości Obudowa:

[AllowAnonymous] 
public JsonResult JobsAutoFill(string Prefix) 
{ 
    //Note : you can bind same list from database 


    List<Jobs> ObjList = new List<Jobs>(); 

    ObjList = GetAllJobs(); 

    //Searching records from list using LINQ query 


    var JobNames = (from N in ObjList 
        where N.Name.ToLower().StartsWith(Prefix.ToLower()) 
        select new { N.Name }); 
    return Json(JobNames, JsonRequestBehavior.AllowGet); 
} 
3

Nie należy uczynić go AllowAnonymous jeśli robi to musi być mieć dostęp publiczny. A po drugie zmienić zapytanie dla lepszej wydajności:

var JobNames = (from N in ObjList 
       where N.Name.ToLower().StartsWith(Prefix.ToLower()) 
       select N.Name); 

Oczywiście trzeba zwrócić tablicę ciągów. Ale twój kod zwraca tablicę obiektów, która ma jedną właściwość string.

i zmień kod skryptu wyznaczonego według aktualizacjach:

success: function (data) { 
        response($.map(data, function (obj) { 
         return { 
          label: obj, 
          value: obj 
         }; 
        })); 
       } 
3

Dont Change pozwalają Anonim zmienić wywołanie ajax takiego zdać parametru w ciągu kwerendy ten trafi swoją funkcję zaplecza. mam nadzieję, że to ci pomoże

$(function() { 
$("#jobtitle").autocomplete({ 
    source: function (request, response) { 
     $.ajax({ 
      url: '@Url.Action("JobsAutoFill", "Account")?Prefix='+$("#jobtitle").val(), 
      data: { 
       Prefix: request.term 
      }, 
      success: function (data) { 
       response($.map(data, function (obj) { 
        return { 
         label: obj.Name, 
         value: obj.Name 
        }; 
       })); 
      } 
     }); 
    }, 
    minLength: 1 
}); 

});