我可以在我的 ViewModel 中创建一个带有嵌套 IEnumerable 的 MVC webgrid

Can I create a MVC webgrid with a nested IEnumerable in my ViewModel

我的情况与this guy类似。我还希望将 @model IEnumberable<> 放在父级中,这是一个普通的@model。我用结合了两者的视图模型完成了整个事情。但是现在当我想实现我的 webgrid 时,我不知道如何进行。我应该如何将模型绑定到 webgrid,我应该使用 @foreach 因为我在技术上没有 IEnumerable 模型但我确实有该模型的 IEnumberable 属性?

@model MyViewModel

@{
var myWebGrid = new WebGrid(Model.theIEnumarablePropertyOfMyViewModel);
}

@foreach (var item in Model.theIEnumarablePropertyOfMyViewModel){
@myWebGrid.GetHtml()
}

只需将您的视图模型视为模型将包含的内容的声明。如果你想在你的模型上使用 IEnumerable,它不是 @model IEnumerable,它只是你的 @models.IEnumerable。它只是输入预期的对象,不要挂断什么是 "Normal" 模型。

普通模型只包含您在视图中所需的内容,如果在这种情况下您认为 Ienumerable 是您需要的,只需将它放在模型上即可。

谈论 IEnumerables 为什么不创建一个列表,其中包含要放入 webgrid 的强类型项目,因为列表已经实现了 IEnumerable....?

查看 this article 了解使用 WebGrid 的基本解释。

与您发布的代码相对应的最重要部分(没有嵌套的 IEnumerable):

public ActionResult List()
  {
    IEnumerable<Product> model =
      _productService.GetProducts();

    return View(model);
  }

@model IEnumerable<MsdnMvcWebGrid.Domain.Product>
@{
  ViewBag.Title = "Basic Web Grid";
}
@{
  var grid = new WebGrid(Model);
}
@grid.GetHtml()

所以在您的设置中一切看起来都很好,包括嵌套的 IEnumerable,除了以下行:

@foreach (var item in Model.theIEnumarablePropertyOfMyViewModel){
@myWebGrid.GetHtml()
}

您无需再次遍历集合!您已经在 WebGrid 的构造函数中提供了集合,之后您只需调用它的 GetHtml() 方法来呈现结果。所以上面简单地变成了:

@myWebGrid.GetHtml()