当前位置: 首页 > 面试题库 >

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

傅翰池
2023-03-14
问题内容

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

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等网站这样做的方式。它们还允许进行其他过滤(类别仅是顶层)。



 类似资料:
  • 问题内容: 我是laravel的新手,我一直试图将表’student’的所有记录存储到一个变量,然后将该变量传递给视图,以便可以显示它们。 我有一个控制器-ProfileController,里面有一个函数: 我认为我有此代码 我收到此错误:未定义的变量:学生(View:regprofile.blade.php) 问题答案: 你能试试看吗 同时,您可以设置多个类似这样的变量,

  • 问题内容: 我正在使用Swift,在tableview的didSelectRowAtIndexPath方法中出现错误。我想将值传递给另一个视图控制器,即“ secondViewController”。这里,EmployeesId是一个数组。相关代码如下: 但是我收到此错误:致命错误:展开一个Optional值时意外发现nil。 任何帮助将不胜感激。 问题答案: 这是一个有两个假设的一般解决方案。首

  • 我有一个mvc视图和一个局部视图。控制器中有一个ActionResult方法,它将返回一个PartialView。所以,我需要将ViewBag数据从ActionResult方法传递到部分视图。 这是我的控制器 在Index.cshtml视图中 Step1.cshtml局部视图 但是这是行不通的。那么,从viewpack获取数据的正确方法是什么?我想我遵循了错误的方法。请指导我。

  • 在我们讨论数据库和数据模型之前,让我们先讨论一下如何将数据从控制器传递给视图。控制器类将响应请求来的URL。控制器类是给您写代码来处理传入请求的地方,并从数据库中检索数据,并最终决定什么类型的返回结果会发送回浏览器。视图模板可以被控制器用来产生格式化过的HTML从而返回给浏览器。 控制器负责给任何数据或者对象提供一个必需的视图模板,用这个视图模板来Render返回给浏览器的HTML。最佳做法是:一

  • 问题内容: 我想要的是将txtComments的值从View(使用jquery / ajax)传递给Controller。 问题是ajax / jquery不接受脚本标签作为字符串。意思是,当我在txtComments中输入任何脚本/ html标记时,ajax会进入错误功能,而无法进入控制器。 这是jQuery: 这是控制器: 我也试过了逃脱(注释),但是还是一样。 问题答案: 尝试使用该功能的选