1

私は次のように CategoryViewModel を持っています:

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; }
}

CategoryController の GET メソッドは、この CategoryViewModel を使用してオブジェクトをインスタンス化し、すべての製品をこの CategoryViewModel オブジェクトに追加します。次に、すべての製品を繰り返し処理し、カテゴリ オブジェクトに含まれる製品の Selected プロパティを True に設定します。

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);
}

デバッガーを使用して、foreach が実行されることを観察しますが、categoryView には Selected プロパティが False に設定されたままのすべての Products があります。

ただし、これは正常に機能します。

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);
}

誰かが違いを説明し、最初のものが機能しない理由を教えてください。

編集: 私はEF 6を使用しており、製品とカテゴリは多対多の関係でデータベースに保存されています。

4

3 に答える 3

2

他の何かを検索しているときに偶然答えを見つけました:インスタンス化後に SelectList で選択した値を設定する

どうやら、SelectedValueプロパティは読み取り専用で、インスタンス化中にのみ上書きできます。モデルが (厳密に型指定された) ビューに割り当てられると、SelectListItem の SelectedValue は、そのコンストラクターによって、ページ モデルに使用されるオブジェクトの値で上書きされます。

于 2014-01-10T14:38:19.607 に答える
1

このコードを試してみてください。foreach ループが例外をスローする可能性があると思われるため、戻り値が null かどうかを確認できます。

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

    if(p != null) p.Selected = true;
 }
于 2014-01-01T20:25:59.540 に答える
0

foreach()コードブロックが使用しているためcategory.Productsです。を使用するcategoryView.Productsと、変更が表示されるはずです。実際には Selected of eachcategory.Productsを true に設定しており、その後は使用しません。これでお分かりいただけたと思います。

于 2013-12-31T18:58:54.090 に答える