相关实体,嵌套部分视图和viewModel

时间:2013-11-08 14:01:39

标签: c# asp.net-mvc entity-framework model viewmodel

我昨天以一种不太清楚的方式问这个问题并没有得到任何好的反馈,所以我再试一次......

我有一个具有相关实体的实体,可以在一个页面上创建,更新和删除。

如果相关实体由多个成员组成,那么让我们说具有多个产品的商店,我使用部分视图。

所以网址是stores.com/store/edit/44

我的编辑操作会抓取ID为44的商店实体,然后查找商店ID为44 ...

的商品

编辑以添加控制器详细信息

public ActionResult Edit(int id = 0)
{
    store store = db.storess.Find(id);
    IList<product> product = db.products.Where(t => t.storeid == store.storeid).ToList();

    var viewModel = new vwstore();
    viewModel.store = store;
    viewModel.products = product;

    return View(viewModel);
}

结束修改

并将其置于视图模型中......

public store store { get; set; }
public IList<product> products { get; set; }

在我看来,我强烈地输入

@model myproject.viewModel.vwstores

我显示商店详细信息并运行for循环以显示这样的每个产品。

@for (var p = 0; p < Model.store.products.Count(); c++)
{
    @Html.Partial("_product", Model.product[c]);
}

注意我将特定产品型号传递给局部视图。

在我的局部视图中,我使用root实体类型的强类型,而不是像我上面那样的视图模型,因为这就是我需要的东西,这就是我传递给部分...

@model myProjectModel.product

现在我可以显示给定产品的详细信息。

所以现在这是我的问题。如果产品有自己的相关数据,例如类别?

,该怎么办?

问题

  1. 我填写了公共IList产品{get;组;通过了解商店ID。我不知道产品ID,所以如何填写类别列表?

  2. 我的期望是我会在产品部分中嵌入一个类别部分,但是传递模型是一个问题。我需要传递一个带有产品和类别列表的viewmodel,但是如果产品是partial,则只有root实体可用。

  3. 我无法传递像这样的视图模型...... @ Html.Partial(“_ categories”,myviewmodel.categories [c]); 它不会编译。这是viewdatadictionary的用途吗?

  4. 非常感谢任何和所有帮助。

2 个答案:

答案 0 :(得分:1)

尝试使用RenderAction调用操作方法来渲染视图。使用此功能,您可以填充视图模型。

@{ Html.RenderAction("Categories", "Controller", new { productId = product.Id }); }

然后你的视图模型

public Product product {get;set;}
public IList<Category> Categories {get;set;}

<强>控制器

public ActionResult Categories(int productId)
{
   // populate view model based on  product Id
   return PartialView("_Categories", viewmodel);

}

编辑:

或者只是将类别放在产品型号

public class Product
{
   public int Id {get;set;}
   public string Name {get;set;}
   public virtual ICollection<Category> Categories {get;set;}
}

public class Category
{
   public int Id {get;set;}
   public string Name {get;set;}
   public int ProductId {get;set;}
   public virtual Product Product {get;set;}
}

这将允许您循环浏览产品类别:

@foreach (var category in prodocut.Categories)
{
    <td>@category.Name</td>
}

答案 1 :(得分:0)

请参阅以下主要问题的评论

如果您正确设置了模型并且使用了Include,则可以通过简单编写p.Category.Name来显示与产品相关的数据,如果您想要产品的类别名称

public Product
{
   public string Name {get;set;};
   [ForiegnKey("Category")]
   public CategoryId {get;set;};

   public Category Category {get; set;}
} 

的Lamda;

db.Products.Where(x => x.ShopId == shopId).Include("Category").ToList();

或者您正在进行数据访问。

然后,您可以使用

访问类别数据
p.Category.Name