Ich werde Ihnen sagen, im Voraus, dass ich diese Beispiele schrieb, ohne es zu testen, aber es ist nur Sie eine allgemeine Vorstellung davon zu geben, wie mit Drop-Down-Listen/Listenfelder, um fortzufahren richtig. Am Ende werde ich den Link zu meinem GitHub verlassen, wo ich ein einfaches Projekt habe, das ich vor einiger Zeit speziell für solche Fälle geschrieben habe.
Also, fangen wir an. Der Einfachheit halber würde ich die Dropdown-Liste lieber im Controller erstellen lassen. Zum Beispiel:
Nehmen wir an, Sie haben ein Modell:
public class Person
{
public string Name { get; set; }
public string Surname { get; set; }
public string City { get; set; }
[NotMapped]
public SelectList CitySelectList { get; set; }
}
Beachten Sie die CitySelectList
, die NotMapped
ist, da wir es nicht wollen, an die DB zu verbinden. Der Wert von CitySelectList
wird in der DB durch City
gespeichert und dann haben Sie eine Aktion Methode:
public ActionResult Insert()
{
var person = new Person { CitySelectList = new SelectList(
new List<SelectListItem>
{
new SelectListItem { Text = "Cambridge", Value = "Ca" },
new SelectListItem { Text = "Oxford", Value = "Ox" },
new SelectListItem { Text = "Sheffield", Value = "Sh" }
}, "Value", "Text") };
return View(person);
}
Hier können Sie sehen, dass ich eine Instanz von Person
erschaffe und an die Ansicht übergeben. Dies ist der beste Weg, um eine Ansicht mit vordefinierten Werten zu laden. Und der wichtigste vordefinierte Wert ist in diesem Fall die Dropdown-Liste.
The View aussehen würde mehr oder weniger wie folgt aus:
@model Person
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-group">
@Html.LabelFor(m => m.Name, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(m => m.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(m => m.Name, "", new { @class = "text-danger" })
</div>
<div class="form-group">
@Html.LabelFor(m => m.Surname, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(m => m.Surname, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(m => m.Surname, "", new { @class = "text-danger" })
</div>
<div class="form-group">
@Html.LabelFor(m => m.City, htmlAttributes: new { @class = "control-label" })
@* Important *@
@Html.EditorFor(m => m.CitySelectList, new { htmlAttributes = new { @class = "form-control", multiple = "multiple" } })
@* /Important *@
@Html.ValidationMessageFor(m => m.City, "", new { @class = "text-danger" })
</div>
}
Wie Sie rufe ich die Dropdown-Liste durch eine EditorFor 2 Htmlattributes vorbei zu sehen. Das wichtigste ist multiple = "multiple"
, da dies die Art der Artikelliste ist, die ich auf der Seite zeigen werde. Wie? Durch eine Editor-Vorlage, die speziell dafür entwickelt wurde. Wenn Sie mit dessen Konzept und Verwendung nicht vertraut sind, können Sie this website für den Start überprüfen. Die Template-Editor kann unten gesehen werden:
@model SelectList
@{
var htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]);
}
@if (!htmlAttributes.ContainsKey("multiple"))
{
@Html.DropDownListFor(m => m.SelectedValue, Model.SelectListItems, htmlAttributes)
}
else
{
@Html.ListBoxFor(m => m.SelectedValues, Model.SelectListItems, htmlAttributes)
}
Ein Detail an dieser Editor Vorlage: Haben Sie bemerkt, dass ich das Dropdown-Liste/Listenfeld für das SelectedValue erschaffe (n)? Das ist etwas, das ein bisschen Kopfschmerzen verursachen könnte, wenn Sie alle Werte, aber Sie können handhaben, in der POST-Methode, auf diese Weise:
[HttpPost]
public ActionResult Insert(Person person)
{
person.City = person.CitySelectList.SelectedValues;
// Some code goes here
return View();
}
, dass es sein sollte.Aber, wie ich schon sagte, ich habe einen Arbeitscode here, so dass Sie laufen und sehen können, wie es funktioniert. Und auch eine Erklärung des Codes von GitHub right here für den Fall, dass Sie brauchen.
public ActionResult Insert (FormCollection frm) Dies sollte ein echtes Modell mit Feldern sein, die den Eingaben in html entsprechen – Steve
Verwenden Sie 'DropDownList()' nicht mit 'multiple' - verwenden Sie' ListBoxFor() '(siehe [diese Antwort] (http://stackoverflow.com/questions/40725358/why-does-the-dropdownlistfor-lose-the-multiple-selection-after-submit-but-the-li/40732481#40732481)). Und niemals 'FormCollection'. Erstellen Sie ein Ansichtsmodell und binden Sie es an eine Eigenschaft - beziehen Sie sich auf [diese Antwort] (http://stackoverflow.com/questions/37848223/listboxfor-not-letting-me-select-multiple-items-mvc/37848327#37848327) für eine typische Implementierung –