将多个结果集传递给ASP.NET MVC中的控制器的视图?

所以我有一个控制器设置如下:

using NonStockSystem.Models; namespace NonStockSystem.Controllers { [Authorize(Users = "DOMAIN\\rburke")] public class AdminController : Controller { private NonStockSystemDataContext db = new NonStockSystemDataContext(); public ActionResult Index() { var enumProducts = from p in db.Products select p; ViewData["Title"] = "Administration"; return View(enumProducts.ToList()); } } } 

Admin控制器上的Index视图只列出系统中的产品,并允许我们单击产品以查看/编辑/删除它。 真的很简单。 但是,每个产品都有一个CategoryID,它告诉我们哪个类别存储在一个单独的表中。

(非常简化的)当前视图是这样的:

      (<a href="https://stackoverflow.com/Admin/Edit/">Edit - <a href="https://stackoverflow.com/Admin/Delete/">Delete)

目前这很好,因为系统中只有10或15个产品,而我开发和测试它然而,一旦我部署它将有大约。 数据库中有300个产品。 我很好地将它们全部显示在一个页面上但是我想使用(一个href =“#category”)链接很像维基百科这样做在页面顶部我可以有类别列表,当你点击一个它带你到页面的适当部分。 所以,我在这种情况下的看法如下:

    
  • <a href="#">

<a name="">

(<a href="https://stackoverflow.com/Admin/Edit/">Edit - <a href="https://stackoverflow.com/Admin/Delete/">Delete)
} %>

首先,我并不完全确定这是“正确”的方式,所以我绝对愿意采取不同的做事方式,但如果这是方法,那么我需要知道如何(1 )将两个结果集传递给视图(产品和类别)和(2)循环遍历每个foreach循环中的Products子集,只获取相应类别中的那些?

干杯!

你有两种选择。 首先,您可以创建一个仅包含Products和Categories集合的仅查看模型。 其次,您可以在ViewData中传递一个或两个模型,而不是将其设置为页面的模型。

 public class CategoryProduct { public IEnumerable Products { get; set; } public IEnumerable Categories {get; set; } } .... return View( new CategoryProduct { Products = products, Categories = categories } ); 

这允许您使用强类型视图模型并获取智能感知,但需要花费额外的类来维护。

或(一种选择)

 ViewData["categories"] = categories; return View( products ); 

这需要为类别强制转换ViewData,以便您可以强类型地使用它。 在这种情况下的产品是模型。 您可以在ViewData中交换它们或将它们放在一起。

就你的方法而言,我没关系。 另一种方法是将其分页,以便不是所有类别都存在于同一页面上以保持页面长度不变。 您仍然会在顶部列出所有类别,但有些可能需要回发来获取新的数据页面。 这可能有点复杂,但会在产品数量增加时加快加载时间。 另一种方法是使用钻取。 首先选择一个类别,然后只显示该类别中的产品。 这些也可以被分页。 我认为这更像是亚马逊,Buy.com等网站的做法。 它们还允许额外的过滤(类别只是顶级)。