У меня есть две автоматически сгенерированные модели базы данных (Product и ProductDetails), которые я объединил в ViewModel, чтобы я мог редактировать все данные одновременно.
Что меня смущает, так это часть, где я должен перебирать ICollection Product_ProductCategoryAttributes (в модели ProductDetail) внутри представления, чтобы позволить .NET автоматически привязывать свойства к ViewModel. Я пытался использовать цикл for, а также цикл foreach, но безуспешно, так как элементы управления создаются с неправильными именами (необходимыми для автоматической привязки).
Модель продукта
public partial class Product
{
public Product()
{
this.ProductDetail = new HashSet<ProductDetail>();
}
public int idProduct { get; set; }
public int idProductCategory { get; set; }
public string EAN { get; set; }
public string UID { get; set; }
public bool Active { get; set; }
public virtual ProductCategory ProductCategory { get; set; }
public virtual ICollection<ProductDetail> ProductDetail { get; set; }
}
Модель ProductDetail
public partial class ProductDetail
{
public ProductDetail()
{
this.Product_ProductCategoryAttribute = new HashSet<Product_ProductCategoryAttribute>();
}
public int idProductDetail { get; set; }
public int idProductCategory { get; set; }
public int idMeta { get; set; }
public int idProduct { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual Meta Meta { get; set; }
public virtual Product Product { get; set; }
public virtual ICollection<Product_ProductCategoryAttribute> Product_ProductCategoryAttribute { get; set; }
public virtual ProductCategory ProductCategory { get; set; }
}
ProductViewModel. У одного продукта может быть много сведений о продукте.
public class ProductViewModel
{
public Product Product { get; set; }
public List<ProductDetail> ProductDetails { get; set; }
}
Просмотр (некоторый код намеренно опущен)
@for (int i = 0; i < Model.ProductDetails.Count(); i++)
{
@Html.TextAreaFor(model => model.ProductDetails[i].Description, new { @class = "form-control", @rows = "3" })
@for (int j = 0; j < Model.ProductDetails[i].Product_ProductCategoryAttribute.Count(); j++)
{
@Html.HiddenFor(model => model.ProductDetails[i].Product_ProductCategoryAttribute.ElementAt(j).idProductCategoryAttribute)
@Html.TextBoxFor(model => model.ProductDetails[i].Product_ProductCategoryAttribute.ElementAt(j).Value, new { @class = "form-control" })
}
}
Все элементы управления за пределами второго цикла for называются правильно, например. ProductDetails[0].Description, однако элементы управления, сгенерированные во втором цикле for, получают свое имя по значению свойства, которым в данном случае является Value и АтрибутКатегорииПродукта. Если я не ошибаюсь, одним из решений было бы преобразование ICollection в IList, но с автогенерацией модели я не думаю, что это был бы лучший вариант.