Füllen Sie das Dropdown-Feld Select2 aus der Datenbank in MVC 4 aus
Ich brauche Hilfe beim Schreiben der jquery / ajax, um a zu füllenSelect2 Dropdown-Feld.
Für diejenigen, die nicht wissen, wasSelect2 ist, es ist eine JavaScript-Erweiterung, um Twitter-Bootstrap-Looks und Such- / Tippfunktionen in einem Dropdown-Feld mit einer HTML-Auswahlliste bereitzustellen. Weitere Informationen finden Sie in den Beispielen hier:Select2 Github Seite
AKTUALISIERT - Gelöst!Also habe ich endlich alles zusammengestellt und die Lösung für meine Probleme bestand darin, dass mir Funktionen zum Formatieren der Ergebnisse und der Listenauswahl fehlten. Der folgende Code erzeugt eine FunktionSelect2 dropbox mit typ-ahead perfekt.
Json-Methode auf dem Controller:
public JsonResult FetchItems(string query)
{
DatabaseContext dbContext = new DatabaseContext(); //init dbContext
List<Item> itemsList = dbContext.Items.ToList(); //fetch list of items from db table
List<Item> resultsList = new List<Item>; //create empty results list
foreach(var item in itemsList)
{
//if any item contains the query string
if (item.ItemName.IndexOf(query, StringComparison.OrdinalIgnoreCase) >= 0)
{
resultsList.Add(item); //then add item to the results list
}
}
resultsList.Sort(delegate(Item c1, Item c2) { return c1.ItemName.CompareTo(c2.ItemName); }); //sort the results list alphabetically by ItemName
var serialisedJson = from result in resultsList //serialise the results list into json
select new
{
name = result.ItemName, //each json object will have
id = result.ItemID //these two variables [name, id]
};
return Json(serialisedJson , JsonRequestBehavior.AllowGet); //return the serialised results list
}
Die obige Json - Controller - Methode gibt eine Liste serialisierter Json - Objekte zurück, deren ItemName die angegebene Zeichenfolge "query" enthält (diese "query" stammt aus dem Suchfeld in derSelect2 Dropbox).
Der folgende Code ist das Javascript in der Ansicht (oder das Layout, wenn Sie es vorziehen), um das zu betreibenSelect2 Drop-Box.
Javascript:
$("#hiddenHtmlInput").select2({
initSelection: function (element, callback) {
var elementText = "@ViewBag.currentItemName";
callback({ "name": elementText });
},
placeholder: "Select an Item",
allowClear: true,
style: "display: inline-block",
minimumInputLength: 2, //you can specify a min. query length to return results
ajax:{
cache: false,
dataType: "json",
type: "GET",
url: "@Url.Action("JsonControllerMethod", "ControllerName")",
data: function (searchTerm) {
return { query: searchTerm };
},
results: function (data) {
return {results: data};
}
},
formatResult: itemFormatResult,
formatSelection: function(item){
return item.name;
}
escapeMarkup: function (m) { return m; }
});
Dann benötigen Sie im Hauptteil der Ansicht ein verstecktes Eingabeelement, dasSelect2 wird die Dropbox zu rendern.
HTML:
<input id="hiddenHtmlInput" type="hidden" class="bigdrop" style="width: 30%" value=""/>
Oder hängen Sie ein MVC Razor html.hidden-Element an Ihr Ansichtsmodell an, damit Sie die ID des ausgewählten Elements wieder auf dem Server veröffentlichen können.
Html (MVC Razor):
@Html.HiddenFor(m => m.ItemModel.ItemId, new { id = "hiddenHtmlInput", @class = "bigdrop", style = "width: 30%", placeholder = "Select an Item" })