2009-05-14 11 views
2

In unserer MVC-Anwendung verwenden wir jQuery Autocomplete-Steuerelement auf mehreren Seiten. Dies funktioniert gut auf Create, aber ich kann es nicht auf Edit arbeiten lassen.MVC: Wert in Autocomplete auf Edit setzen

Effektiv weiß ich nicht, wie die Autocomplete-Steuerelemente die Daten aus dem Modell laden und sich trotzdem als Autocomplete verhalten, falls der Benutzer den Wert ändern möchte.

Auch wie kann ich sicherstellen, dass der Wert im selben Format angezeigt wird, das in Create Anrufe verwendet wird?

Alle unsere Autocomplete-Steuerelemente verfügen über entsprechende Controller und alle JSon-Analyseergebnisse.

+1

Was meinen Sie mit preload und verhalten sich immer noch wie eine Autocomplete? Soll das Textfeld einen Wert enthalten, der vom Controller an die Ansicht gesendet wird? –

Antwort

0

Versuchen wir es! Nehmen wir an: Angenommen, Sie hätten eine Liste von Ländern, die Sie filtern müssten. Auto Complete weiß standardmäßig einige Standardeinstellungen, aber Sie möchten wirklich CountryName und Sie wissen auch, dass jeder Tastendruck einen Ajax-Aufruf an die von Ihnen angegebene URL ausführt. eine Aktion Methode, wie so erstellen:

public ActionResult LookupCountry(string q, int limit) 
    { 
     var list = GetListOfCountries(q, 0, limit); 
     var data = from s in list select new {s.CountryName}; 
     return Json(data); 
    } 

Hier die JQuery ist:

$(document).ready(function() { 
    $('#txtCountryName').autocomplete('<%=Url.Action("LookupCountry", "MyController") %>', { 
     dataType: 'json', 
     parse: function(data) { 
      var rows = new Array(); 
      for(var i=0; i<data.length; i++){ 
       rows[i] = { data:data[i], value:data[i].CountryName,   result:data[i].CountryName}; 
      } 
      return rows; 
     }, 
     formatItem: function(row, i, n) { 
      return row.CountryName; 
     }, 
     width: 300, 
     mustMatch: true, 
    }); 
}); 

Hier ist die Html

<html><head></head><body>@Html.TextBox("txtCountryName",Model.CountryName)</body></html> 

Grundsätzlich Die Magie im Aufruf zu LookUpCountry Die GetCountriesList (String-Abfrage, Int-Startindex, Int-Limit) Rückgabe MyCountries.Where(c => c.CountryName.SubString(startindex, limit).Contains(query)).ToList();

Sie machen also Ihre eigene Trimmen-Funktion, weil JQuery keine Ahnung hat, was CountryName ist oder wie es zu trimmen ist. Wie auch immer, wenn es ein Javascript-Objekt war ich bin nicht ganz sicher, aber tun

var jsonString = @Html.GetListOfCountries() //Or Model.Countries.ToJSONString() 
var json = JSON.stringify(jsonString); //also JSON.Parse(jsonString) if stringify won't work 

, die die notwendigen Länder als Html Helper Extension-Methode zurückkehren würde. Und vielleicht wäre es als eine Liste von JavaScript-Objekten klug genug, um es so in seiner Muttersprache zu handhaben. Der erste Ansatz funktioniert jedoch für mich.