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 实例化一个对象并将所有 Products 添加到此 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。

但是,这个工作正常:

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

我在搜索其他内容时偶然找到了答案:Set selected value in SelectList after instantiation

显然,该SelectedValue属性是只读的,只能在实例化期间被覆盖。当模型分配给视图(强类型)时,SelectListItem 的 SelectedValue 将被其构造函数覆盖为用于页面模型的对象的值。

于 2014-01-10T14:38:19.607 回答
1

试试这段代码,我怀疑你的 foreach 循环可能会抛出异常,所以你可以检查返回值是否为空。

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 each 设置category.Products为 true 并且之后不使用它。我希望你现在清楚了。

于 2013-12-31T18:58:54.090 回答