如何解决将多个结果集从ASP.NET MVC中的控制器传递到视图?
您有两种选择。首先,您可以创建一个仅包含产品和类别集合的仅查看模型。其次,您可以在ViewData中传递一个或两个模型,而不是将其设置为页面的Model。
public class CategoryProduct
{
public IEnumerable<Product> Products { get; set; }
public IEnumerable<Category> Categories {get; set; }
}
....
return View( new CategoryProduct { Products = products,
Categories = categories } );
这使您可以使用强类型视图模型并获得智能感知,但需要额外维护一个类。
或(一个选项)
ViewData["categories"] = categories;
return View( products );
这需要强制转换类别的ViewData,以便您可以使用强类型输入。在这种情况下,产品就是模型。您可以交换它们,也可以将两者都放在ViewData中。
至于您的方法,我可以接受。一种替代方法是使其分页,以便并非所有类别都存在于同一页面上,以缩短页面长度。您仍然会在顶部列出所有类别,但是有些类别可能需要回发才能获取新的数据页面。这可能有点复杂,但是当产品数量增加时,它将加快加载时间。另一种方法是使用向下钻取。首先选择一个类别,然后仅显示该类别中的产品。这些也可以分页。我认为这通常是Amazon,Buy.com等网站这样做的方式。它们还允许进行其他过滤(类别仅是顶层)。
解决方法
所以我有一个控制器设置如下:
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());
}
}
}
管理控制器上的“索引”视图仅列出系统中的产品,并允许我们单击产品以查看/编辑/删除该产品。真的很简单。但是,每个产品都有一个CategoryID,该ID告诉我们该产品属于哪个类别,存储在单独的表中。
(非常简化的)当前视图是这样的:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="NonStockSystem.Views.Home.Admin" %>
<%@ Import Namespace="NonStockSystem.Models" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<%
foreach (Product p in (IEnumerable)ViewData.Model)
{ %>
<%=p.Name.ToString() %> (<a href="/Admin/Edit/<%=p.ID.ToString() %>">Edit</a> - <a href="/Admin/Delete/<%=p.ID.ToString() %>">Delete</a>)<br />
<%
} %>
</asp:Content>
目前这很好,因为在我开发和测试该系统时,系统中只有10或15种产品,但是一旦我部署它,大约就会有。数据库中有300种产品。我可以将它们全部显示在一页上,但是我想使用(a
href
=“#category”)链接,就像Wikipedia一样,因此在页面顶部,我可以获得类别列表,当您单击时它会将您带到页面的相应部分。因此,在这种情况下,我的观点将如下所示:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="NonStockSystem.Views.Home.Admin" %>
<%@ Import Namespace="NonStockSystem.Models" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<ul>
<%
foreach (Category c in (IEnumerable)ViewData.Model)
{ %>
<li><a href="#<%=c.Name.ToString() %>"><%=c.Name.ToString() %></a></li>
<%
} %>
</ul>
<hr />
<%
foreach (Category c in (IEnumerable)ViewData.Model)
{ %>
<% // Display the category name above all products from that category %>
<h2><a name="<%=c.Name.ToString() %>"><%=c.Name.ToString() %></a></h2>
<% // Need to limit the following foreach to grab only products in this category
foreach (Product p in (IEnumerable)ViewData.Model)
{ %>
<%=p.Name.ToString() %> (<a href="/Admin/Edit/<%=p.ID.ToString() %>">Edit</a> - <a href="/Admin/Delete/<%=p.ID.ToString() %>">Delete</a>)<br />
<%
} %>
} %>
</asp:Content>
首先,我不完全确定这是执行此操作的“正确”方法,因此,我绝对乐于接受有关其他处理方法的建议,但是如果这是可行的方法,那么我需要知道如何做(1
)将两个结果集传递到视图(产品和类别),并且(2)在每个foreach循环中通过产品的子集循环,从而仅获取适当类别中的产品?
干杯!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。