Frage

Ich habe ein CategoryViewModel wie folgt:

public class CategoryViewModel
{
    public string Id {get; set;}
    public string Name { get; set; }
    public IEnumerable<SelectListItem> Products { get; set; }
    public List<string> SelectedProductIds { get; set; }
}

Die GET -Methode von CategoryController verwendet dieses CategoryViewModel, um ein Objekt zu instanziieren, und fügt alle Produkte zu diesem CategoryViewModel -Objekt hinzu. Dann iteriert es alle Produkte und setzt die ausgewählte Eigenschaft von Produkten auf True, die im Kategorieobjekt enthalten sind:

public ActionResult CategoryController(string categoryId)
{
    CategoryDbContext db = new CategoryDbContext();
    CategoryRepository CategoryRepo = new CategoryRepository(db);
    ProductRepository ProductRepo = new ProductRepository(db);

    Category category = CategoryRepo.GetCategory(categoryId);

    CategoryViewModel categoryView = new CategoryViewModel() 
    {
        Id = category.Id,                   
        Name = category.Name,                             
        Products = from product in ProductRepo.GetAllProducts()
                   select new SelectListItem { Text = product.Name, Value = product.Id, Selected = false}
    };

        foreach (var product in category.Products)
        {
           categoryView.Products.Where(x => x.Value == product.Id).FirstOrDefault().Selected = true;
        }

    return View(categoryView);
}

Mit dem Debugger stelle ich fest, dass foreach ausgeführt wird, aber CategoryView hat alle Produkte mit ausgewählter Eigenschaft weiterhin auf false.

Dieser funktioniert jedoch gut:

public ActionResult CategoryController(string categoryId)
{
    CategoryDbContext db = new CategoryDbContext();
    CategoryRepository CategoryRepo = new CategoryRepository(db);
    ProductRepository ProductRepo = new ProductRepository(db);

    Category category = CategoryRepo.GetCategory(categoryId);

    CategoryViewModel categoryView = new CategoryViewModel() 
    {
        Id = category.Id,                   
        Name = category.Name,                             
        Products = from product in ProductRepo.GetAllProducts()
                   select new SelectListItem { Text = product.Name, Value = product.Id, Selected = category.Products.Contains(product)}
    };

    return View(categoryView);
}

Kann jemand bitte den Unterschied erklären und warum der erste nicht funktioniert?

BEARBEITEN:Ich verwende EF 6 und Produkte und Kategorien werden in der Datenbank mit vielen zu vielen Beziehungen gespeichert.

War es hilfreich?

Lösung

Ich fand die Antwort zufällig, während ich nach etwas anderem suchte: Setzen Sie den ausgewählten Wert in der Selektivliste nach der Instanziierung

Anscheinend das SelectedValue Eigentum ist schreibgeschützt und kann nur während der Instanion überschrieben werden. Wenn ein Modell der Ansicht zugeordnet ist (stark typisch), wird der ausgewählte Wert des Selektionslistitems durch seinen Konstruktor mit dem Wert des für das Seitenmodell verwendeten Objekts überschrieben.

Andere Tipps

Probieren Sie diesen Code aus, ich vermute, dass Ihre Foreach -Schleife möglicherweise eine Ausnahme ausführt, damit Sie prüfen können, ob der Rückgabewert NULL ist.

foreach (var product in category.Products)
{
    var p = categoryView.Products.Where(x => x.Value == product.Id).FirstOrDefault();

    if(p != null) p.Selected = true;
 }

Weil du foreach() Codeblock verwendet category.Products. Wenn du benutzt categoryView.Products, Sie sollten die Änderung sehen. Sie setzen praktisch ausgewählt von jedem category.Products zu wahr und benutze es nicht danach. Ich hoffe es ist dir jetzt klar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top