Wednesday, March 1, 2017

JQuery UI Autocomplete not reaching ActionResult C# MVC

Leave a Comment

I have read many posts with the same issue, but none help, so apologies for the duplicate question :( Ive followed the simple sample on the JQueryUI site by hard coding values and the autocomplete works, but I need it to come from my Database.

View:

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

JS:

EDIT: I added an alert on success, and the alert is being called, but there is no data(i.e. No data being pulled from 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> 

And I have added the Links required :

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

Below is my ActionResult(Actually a JsonResult) & Function to pull the list of Jobs:

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

Am I missing something or doing something wrong ?

I appreciate any help, thanks!

3 Answers

Answers 1

I got it working!

First thing that was causing an issue was that I needed to add [AllowAnonymous] above my ActionResult.

Secondly, I changed my Ajax call to this:

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

Below is my ActionResult. I added a change that would sort out the case sensitivity:

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

Answers 2

You shouldn't make it AllowAnonymous is it doesnt have to be have public access. And secondly change your query for better performance:

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

Obviously you need to return a string array. But your code is returning an object array which has a single string property.

And change your script code acccording to updates:

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

Answers 3

Dont Change allow to anonymous change your ajax call like that pass your parameter in query string this will hit your back end function. hope this will help you

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

});

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment