Вопрос

У меня есть категориявивмодель следующим образом:

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

Метод GET CategoryController использует эту категорию ViewModel для создания объекта и добавляет все продукты в этот объект CategoryViewModel. Затем он проходит через все продукты и устанавливает выбранное свойство продуктов на 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 выполняет, но CategyRyView имеет все продукты с выбранным свойством, все еще установленным на 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, а продукты и категории хранятся в базе данных с отношениями многих ко многим.

Это было полезно?

Решение

Я нашел ответ случайно, и в поисках чего -то другого: Установите выбранное значение в SelectList после экземпляра

Видимо, SelectedValue Собственность только для чтения и может быть перезаписана только во время инстанции. Когда модель присваивается представлению (сильно типичному), выбранное значение SelectListItem перезаписано его конструктором со значением объекта, используемого для модели страницы.

Другие советы

Попробуйте этот код, я подозреваю, что ваш цикл Foreach может вызвать исключение, чтобы вы могли проверить, является ли возвратное значение нулевым.

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

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

Потому что твой foreach() Кодовый блок использует category.Products. Анкет Если вы используете categoryView.Products, вы должны увидеть изменение. Вы практически устанавливаете выбор каждого category.Products чтобы истинно и не использовать его после. Я надеюсь, что сейчас вам ясно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top