【问题标题】:Is it possible to send more than one model object to an ASP.NET MVC View?是否可以将多个模型对象发送到 ASP.NET MVC 视图?
【发布时间】:2010-10-05 13:49:02
【问题描述】:

在我的起始页上,我想显示我在其他页面上拥有的几个不同列表中的第一个项目 - 有点像 SO 上的“最近”页面显示最近的帖子和最近的 cmets。就我而言,我想在留言簿中列出最近的两个帖子,以及下一个即将发生的事件。

为了做到这一点,如何将多个模型对象传递给我的视图?甚至可能吗?如果没有,应该怎么做?

【问题讨论】:

  • 这篇文章已有六年半的历史了,我今天对它投了反对票。任何关于为什么的评论都非常受欢迎。

标签: .net asp.net-mvc entity-framework datamodel


【解决方案1】:

tvanfosson 解决方案的替代方案是创建一个强类型视图,以便您获得 cvompile-time 检查和更少的“魔术字符串”。

示例...

假设你有这个类:

public class FrontPageViewData
{
    public List<Post> Posts { get; set; }
    public List<Comment> Comments { get; set; }
}

然后在你的控制器中...

public ActionResult Index()
{
    FrontPageViewData viewData = new FrontPageViewData();
    viewData.Posts = DB.Posts.ToList();
    viewData.Comments = DB.Comments.ToList();
    return View(viewData);
}

最后……在你看来。如果您设置视图注册行以使用它,这将允许您使用智能感知访问传入的视图数据(注意部分。这意味着 Model 属性将是传入 viewdata 参数的实例到您的 VIew 方法中控制器。

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<FrontPageViewData>" %>
<asp:Content ID="MainContent" ContentPlaceHolderID="MainContent" runat="server">
<%= Model.Posts.Count().ToString(); %>
<%= Model.Comments.Count().ToString(); %>
</asp:Content>

当然这只是一个演示,我不会逐字使用这段代码。

【讨论】:

  • 如果将模型传递给部分模型,则不会进行编译时检查,因为模型参数是对象类型。我不一定喜欢创建一个新类来保存可以很容易地存在于现有容器中的数据的想法。为什么不把 ViewDataWrapper 写成抽象呢?
  • >>...你没有得到编译时检查,因为模型参数是对象类型......你确实通过指定 ViewUserControl 的类型参数来进行编译时检查
  • 这当然是我的首选。主要是因为它在我的域模型和视图之间创建了一个抽象级别。因此,我应该能够在不影响视图的情况下更改域模型,反之亦然。
  • 我正在使用这种类型的模型来处理更复杂的东西,而且它更简洁,是一种很好的做事方式。
  • 对 ToString() 的调用是多余的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
相关资源
最近更新 更多