2017-02-16 3 views
15

Ich habe viele Beiträge mit dem gleichen Problem gelesen, aber keine Hilfe, so Entschuldigung für die doppelte Frage :(Ich folgte dem einfachen Beispiel auf der JQueryUI-Website durch harte Codierung Werte und die Autocomplete funktioniert , aber ich brauche es aus meiner Datenbank kommenJQuery UI Autocomplete nicht erreichen ActionResult C# MVC

Ausblick:.

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

JS:

EDIT: ich habe eine Warnung auf Erfolg, und der Alarm genannt wird, aber es ist nicht dat a. Keine Daten, die von DB) gezogen

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

Und ich habe die Links erforderlich hinzugefügt:

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

Unten ist meine Action (Eigentlich ein JsonResult) & Funktion zu ziehen, um die Liste der 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); 
     } 

Fehle ich etwas oder mache ich etwas falsch?

Ich schätze jede Hilfe, danke!

+0

Jeder kann helfen? – AxleWack

+1

Ignore jquery für jetzt. Dies ist eine GET-Methode. Versuchen Sie, über einen Webbrowser darauf zuzugreifen. Funktioniert es? Ist Jobs serialisierbar? Können Sie einen Breakpoint auf dem Server treffen? Was ist innerhalb des "Daten" -Objekts? Versuchen Sie auch data.Data –

+0

Ive war in der Lage, den Controller jetzt zu erreichen und zu sehen, dass die Jobs zurückgegeben werden, aber jetzt zeigt es nicht (ich sehe nur kleine Boxen Popup mit keinem Text drin). Ich habe versucht, Daten.Data und es sagte undefiniert. – AxleWack

Antwort

13

Ich habe es funktioniert!

Das erste, was ein Problem verursachte, war, dass ich [AllowAnonymous] über meinem ActionResult hinzufügen musste.

Zweitens änderte ich meine Ajax-Aufruf dazu:

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

Im Folgenden meine Action ist. Ich fügte hinzu, eine Änderung, die die Groß- und Kleinschreibung aussortieren würde:

[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

Sie es nicht AllowAnonymous machen sollte, wenn es sein muss Zugang der Öffentlichkeit müssen tut. Und zweitens Ihre Anfrage für eine bessere Leistung ändern:

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

Natürlich müssen Sie ein String-Array zurück. Aber Ihr Code gibt ein Objekt-Array zurück, das eine einzelne String-Eigenschaft hat.

Und Ihr Script-Code Acccording zu Updates ändern:

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

Dont ändern läßt anonym wie Ihren Ajax-Aufruf ändern, dass Ihre Parameter in Abfrage-String übergibt dies Ihre Back-End-Funktion treffen wird. hoffe das hilft dir

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

});

Verwandte Themen