문제

다음과 같이 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 객체에 추가합니다. 그런 다음 모든 제품을 반복하고 선택한 제품의 속성을 범주 개체에 포함 된 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 Executes를 관찰하지만 CategoryView에는 선택된 속성이있는 모든 제품이 여전히 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 속성은 읽기 전용이며 Instantion 동안 만 덮어 쓸 수 있습니다. 모델이보기에 할당되면 (강력한 유형) SelectListItem의 선택된 값은 Page Model에 사용 된 객체의 값을 생성자에 의해 덮어 씁니다.

다른 팁

이 코드를 시도하면 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;
 }

당신의 foreach() 코드 블록이 사용 중입니다 category.Products. 사용하는 경우 categoryView.Products, 당신은 변화를 볼 수 있어야합니다. 당신은 실제로 각각을 선택하고 있습니다 category.Products 진실하고 그것을 사용하지 않습니다. 지금 당신에게 분명하기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top