[asp.net-mvc] Warum ist ListBox nicht für die Auswahl von Elementen, sondern für ListBox?


Answers

Ich bin auch mit genau diesem gleichen Problem stecken geblieben und habe das gleiche Problem mit ListBox und ListBoxFor festgestellt.

Egal, was ich mache, ich kann keine Auswahlen auf der ListBoxFor auftreten. Wenn ich in die ListBox wechsle und ihr etwas anderes als den Eigenschaftsnamen der Daten nenne, an die ich mich verbinde, erfolgt die Auswahl.

Aber weil ich nicht ListBoxFor verwende und die Daten beispielsweise in einer Modellklasse (Model.Departments) sitzen, bekomme ich auf dem Weg zurück zu meinem Controller keine Modellbindung, und daher ist die Eigenschaft null.

EDIT Ich habe eine Lösung gefunden, die von jemand anderem hier gepostet wurde; Herausforderungen beim Auswählen von Werten in ListBoxFor

Question

Ich habe folgenden Code aus meiner Sicht:

<%= Html.ListBoxFor(c => c.Project.Categories,
        new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>

<%= Html.ListBox("MultiSelectList", 
        new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>

Der einzige Unterschied besteht darin, dass der erste Helper stark typisiert ist (ListBoxFor) und die ausgewählten Elemente (1,2) nicht angezeigt werden, obwohl die Elemente in der Liste usw. erscheinen. Das einfachere ListBox funktioniert wie erwartet.

Ich vermisse hier offensichtlich etwas. Ich kann den zweiten Ansatz verwenden, aber das nervt mich wirklich und ich würde es gerne herausfinden.

Als Referenz ist mein Modell:

public class ProjectEditModel
{
    public Project Project { get; set; }
    public IEnumerable<Project> Projects { get; set; }
    public IEnumerable<Client> Clients { get; set; }
    public IEnumerable<Category> Categories { get; set; }
    public IEnumerable<Tag> Tags { get; set; }
    public ProjectSlide SelectedSlide { get; set; }
}

Aktualisieren

Ich habe gerade den ListBox-Namen in Project.Categories (passend zu meinem Modell) geändert und es fehlt jetzt die Auswahl des Elements.

<%= Html.ListBox("Project.Categories",
        new MultiSelectList(Model.Categories, "Id", "Name", new List<int> { 1, 2 }))%>

Ich verstehe offensichtlich nicht die Magie, die hier passiert.

Update 2

Ok, das ist reine Namensgebung, zum Beispiel funktioniert das ...

<%= Html.ListBox("Project_Tags",
new MultiSelectList(Model.Tags, "Id", "Name", Model.Project.Tags.Select(t => t.Id)))%>

... weil der Feldname Project_Tags und nicht Project.Tags ist, funktioniert alles andere als Tags oder Project.Tags. Ich verstehe nicht, warum dies ein Problem verursachen würde (abgesehen davon, dass es mit dem Namen der Entität übereinstimmt), und ich bin nicht gut genug, um darin nachforschen und es herausfinden zu können.




Sie können auch versuchen, ModelState für c.Project.Categories im Controller zu löschen:

[HttpPost]
public ActionResult Index(ModelType model)
{
    ModelState.Remove("Project.Categories");
    return View("Index", model);
}

Und nutze die nächste Konstruktion:

<%= Html.ListBoxFor(c => c.Project.Categories,
        new MultiSelectList(Model.Categories, "Id", "Name"))%>

Wo c.Project.Categories ist IEnumerable<int> .

Entschuldigung für mein Englisch. Viel Glück!




Versuche dies

<%= Html.ListBoxFor(c => c.Project.Categories,
    new MultiSelectList(
        Model.Categories
        ,"Id"
        ,"Name"
        ,Model.Project.Tags.Select(
        x => new SelectListItem()
            {
            Selected = true,
            Text = x.TEXT,
            Value = x.ID.ToString()
            }).ToList())

       )
)%>



Links