2016-05-31 8 views
0

Ich versuche eine einfache Autovervollständigung mit LINQ zu Entities und Razor (neu auch C# sharp) zu codieren und ich habe Probleme beim Anzeigen von JSON-Daten aus meiner Sicht.C# mvc ajax Konvertiere Liste in JSON String

Mein Controller ist wie folgt:

public ActionResult AutoCompleteCity(string guess) 
{ 
    List<City> listData = null;     
    if (!string.IsNullOrEmpty(guess)) 
    { 
     listData = db.AutoCompleteCity(guess); 
    }     
    return Json(new { Data = listData });     
} 

AJAX-Aufruf: D Jede Art und Weise, wenn ich Datensätze aus der Datenbank abrufen und versuchen zu:

function getCities(input) { 
    var serviceURL = $("#autocompleteURL").val();  
    var url = 
     $.ajax({ 
      type: "POST", 
      url: serviceURL, 
      data: { 
       'guess': input 
      },    
      dataType: 'json', 
      success: function (response) {      
       if (response.Data != null) { 
        if ($("#targetUL") != undefined) {        
         $("#targetUL").remove(); 
        }       
        Data = response.Data; 

        $.each(Data, function (i, value) {             
         $("#targetUL").append($("<li class='targetLI' onclick='javascript:agregarTexto(this)'>" + JSON.stringify(value) + "</li>"));  
        });      
     }); 
} 

Ich könnte eine Klammer oder zwei fehlen übergeben JSON-Werte an die Ansicht der Ausgang ist:

{"Data":[{"Selected":false,"Text":null,"Value":null}]} 

Ich nehme an, ich bin JSON listData nicht korrekt übergeben. Jede Eingabe wird sehr geschätzt werden, danke!

EDIT: Hier ist ein screencap der von listdata in meinem Controller zurückgegebenen Werte enter image description here

Dies ist meine LINQ-Abfrage

public List<City> AutoCompleteCity(string guess) 
     { 
      using (var context = new Sports.SportsEntities()) 
      { 
       var query = (from loc in context.city 
          join prov in context.state on loc.STATE_ID equals prov.STATE_ID 
          where loc.CITY_DESC.Contains(guess.ToUpper()) 
          select new 
          { 
           city = loc.CITY_DESC, 
           state = prov.STATE_DESC, 
          }); 

       IEnumerable<City> cityList= from ba in query.AsEnumerable() 
               select new City(ba.city, ba.state); 

       return cityList.ToList(); 
      } 
     } 
+0

Sie brauchen nicht zu 'JSON.stringify()'. In jeder Schleife können Sie 'value.Value',' value.Selected' oder 'value.Text' verwenden. – Jasen

+0

Wenn Sie in Ihrer MVC-Aktion einen Haltepunkt setzen, (a) wird der korrekte Wert von "rate" in die Aktion übernommen. (b) Was ist der Wert von listData in der return-Anweisung? –

+0

@GlennFerrie Ich habe meinem ursprünglichen Beitrag einen Screenshot mit den Werten hinzugefügt, danke! –

Antwort

0

Dieser Fehler:

{"Data":[{"Selected":false,"Text":null,"Value":null}]} 

wurde verursacht, indem private Attribute in der City-Klasse deklariert wurden oder indem die Getter/Setter-Methoden nicht deklariert wurden, wenn diese Attribute als privat deklariert wurden. Das habe ich herausgefunden, indem ich die Screenshots meiner Frage angesehen habe und nur die Eigenschaften "ausgewählt", "Text" und "Wert" und nicht die Stadt- und Zustandsbeschreibung in den Abfrageergebnissen angezeigt habe unterhalb der Textboxeingabe.

Diese Controller-Methode wird der Trick:

public JsonResult AutoCompleteCity(string term) 
     { 
      List<City> listData = new List<City>(); 
      if (!string.IsNullOrEmpty(term)) 
      { 
       listData = db.AutoCompleteCity(term); 
      } 

      return Json(listData, JsonRequestBehavior.AllowGet); 

     } 
0

Das Problem ist wahrscheinlich dieses Stück Code in dem AJAX-Aufruf:

if ($("#targetUL") != undefined) {        
    $("#targetUL").remove(); 
} 

Auf diese Weise Sie entfernen die ul Tag fro das DOM m und kann daher die li Elemente nicht fügen Sie in diesem Stück Code konstruieren:

$.each(Data, function (i, value) {             
    $("#targetUL").append($("<li class='targetLI' onclick='javascript:agregarTexto(this)'>" + JSON.stringify(value) + "</li>"));  
}); 

Wenn Sie die Liste Verwendung .empty() löschen möchten:

if ($("#targetUL") != undefined) {        
    $("#targetUL").empty(); 
} 
+0

Danke für die Eingabe! Ich habe remove() für empty() wie vorgeschlagen geändert, konnte aber immer noch keine korrekten Werte erhalten. –

0

Es sieht aus wie Ihre Methode Gibt eine Liste von City-Objekten zurück, so dass Sie möglicherweise die Eigenschaft dieser Objekte verwenden müssen, um zum Namen der Stadt zu gelangen, etwa so:

});

0

, wenn Sie eine JSON zurückgeben möchten, ändern Sie das:

public ActionResult AutoCompleteCity(string guess) 

von

public JsonResult AutoCompleteCity(string guess) 

und versuchen auch, dass:

Data = JSON.parse(response.Data); 
+0

JsonResult ist ein ActionResult von dem, was ich gesammelt habe –