다른 것을 찾는 동안 우연히 답을 찾았습니다. 인스턴스화 후 SelectList에서 선택한 값을 설정하십시오
분명히 SelectedValue
속성은 읽기 전용이며 Instantion 동안 만 덮어 쓸 수 있습니다. 모델이보기에 할당되면 (강력한 유형) SelectListItem의 선택된 값은 Page Model에 사용 된 객체의 값을 생성자에 의해 덮어 씁니다.
문제
다음과 같이 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
진실하고 그것을 사용하지 않습니다. 지금 당신에게 분명하기를 바랍니다.