簡體   English   中英

將多個結果集從ASP.NET MVC中的控制器傳遞到視圖?

[英]Passing multiple result sets to a view from a controller in 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());
        }
    }
}

管理控制器上的“索引”視圖僅列出系統中的產品,並允許我們單擊產品以查看/編輯/刪除它。 真的很簡單。 但是,每個產品都有一個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循環中的產品子集循環,僅抓取適當類別中的產品?

干杯!

您有兩種選擇。 首先,您可以創建一個僅包含產品和類別集合的僅查看模型。 其次,您可以在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等網站這樣做的方式。 它們還允許進行其他過濾(類別僅是頂層)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM