将IEnumerable ViewModel传递给View

3

我有两个表,ProductProductImages

。它们涉及 IT 技术相关内容。

+---PRODUCT----+
| ID           |
| Name         |
```````````````

+---PRODUCT Images----+
| ID                  |
| ProductId           |
| URL                 |
```````````````````````

我希望能够通过 ViewModel 在我的 Index View 中显示来自两个表格的数据。

以下是我的ViewModel

public class ProductDisplayViewModel{
    public int ProductId { get; set; }
    public string Name {get; set;}        
    public string ImageUrl { get; set; }

}

public class ProductIenumViewModel
{
    public IEnumerable<ProductDisplayViewModel> productDisplayViewModel { get; set; }
}

这是我的控制器。
 public ActionResult Index()
    {

        var product = new ProductDisplayViewModel
        {
            //ProductId = db.Products.Select(s => s.Id).ToString,
            Name = db.Products.Select(s => s.Name).ToString(),
            ImageUrl = db.ProductImages.Select(s => s.URL).ToString()
        };


        var productIenumViewModel = new ProductIenumViewModel
        {
            productDisplayViewModel =  new List<ProductDisplayViewModel> { product }
        };

        return View(productIenumViewModel);
    }

但是我得到了一个错误,说我传递了 ViewModel.ProductIenumViewModel,但是该字典需要一个类型为 'System.Collections.Generic.IEnumerable 1[ViewModel.ProductDisplayViewModel]' 的模型项。

如果在我的控制器中使用 productDisplayViewModel = IEnumerable<ProductDisplayViewModel> product,我会得到一个错误,说 ProductDisplayViewModel 是一种类型,但像变量一样使用。

编辑 这是我的视图

@model IEnumerable<MyApp.Areas.Admin.ViewModel.ProductDisplayViewModel>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table table-bordered table-striped" >
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Name)
        </th>      
        <th>
            @Html.DisplayNameFor(model => model.ImageUrl)
        </th>  
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
            @Html.DisplayFor(modelItem => item.ImageUrl)
        </td>

        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ProductId }) |
            @Html.ActionLink("Details", "Details", new { id=item.ProductId }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.ProductId })
        </td>
    </tr>
}

</table>

1
你的视图声明是什么? - SLaks
听起来你的视图模型是 IEnumerable<ProductIEnumViewModel>,但它应该只是 ProductIEnumViewModel。或者更好的做法是,摆脱 ProductIEnumViewModel 并使用 IEnumerable<ProductDisplayViewModel> 作为你的模型。 - Dave Zych
我同意,能够看到视图会很好。另外,你似乎删除了控制器动作的相当一部分,但现在代码没有多大意义,因为它不太可能构建成功... - Georges Legros
这段代码看起来问题比那还多,Name = db.Products.Select(s => s.Name).ToString() 或者 ImageUrl = db.ProductImages.Select(s => s.URL).ToString() 对你来说能正常工作吗? - JamieD77
@JamieD77 我不知道,但是它没有给我任何编译错误,因为我无法显示视图,或者如果你能写一个伪代码,告诉我该怎么做才能使它成为正确的代码。 - Muhammad Arslan Jamshaid
1个回答

7
除了您遇到的错误之外,您没有正确组成您的 IEnumerable<ProductDisplayViewModel>
假设您的视图有一个 @model IEnumerable<ProductDisplayViewModel>,那么您的控制器代码应该如下所示:
public ActionResult Index()
{

    var products = db.ProductImages
                     .Include("Product")
                     .Select(a => new ProductDisplayViewModel {
                          ProductId = a.ProductID,
                          Name = a.Product.Name,
                          ImageUrl = a.URL
                     });
    return View(products );
}

好的,感谢您提供简单明了的答案,现在我更好地理解了。您能否稍微解释一下,为什么您在ProductImages中包含了Products,而不是在Product中包含ProductImages - Muhammad Arslan Jamshaid
1
.Include("Products") 告诉 EF 懒加载 ProductImagesProducts 集合。这使您可以访问 Product 属性,例如 IdName。由于您的查询从 db.ProductImages 开始查询,因此您已经可以访问它的属性,所以没有必要包括 ProductImages。您不需要在 where 语句中使用 .Include,因此在 .Select 语句中获取 Product 属性时可能不需要它。我只是为了安全起见添加了它。 - JamieD77

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接