如何在ASP.NET MVC中将多个模型传递给局部视图

10

我一直在阅读Scott Guthrie关于从控制器传递ViewData到视图的帖子,但我不认为这个教训适用于我的特定情况。

(注意:由于客户专有限制,我不能粘贴实际代码,所以如果我编造的案例有点愚蠢/令人困惑,我很抱歉。)

我有一个名为ScenarioController的控制器,它处理与创建Scenario模型相关的各种操作。用户将完成的各种操作是Scenarios的通用CRUD。我可以创建一个网站来处理Scenario模型。然而,我最近更新了Scenario模型,使其由各种子组件(其他对象的列表)组成。相应的视图使用jQuery Tabs加载部分视图,最终加载各个子组件数据的表单。不幸的是,这就是我遇到问题的地方。

我的Index页面目前看起来像这样:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">

<% using (Html.BeginForm()) {%>
    <div id="scenario">
        <div id="tabs">
            <ul>
                <li><a href="#tab1">Tab 1</a></li>
                <li><a href="#tab2">Tab 2</a></li>
                <li><a href="#tab3">Tab 3</a></li>
            </ul>

            <div id="tab1"><% Html.RenderPartial("Tab1"); %></div>
            <div id="tab2"><% Html.RenderPartial("Tab2"); %></div>
            <div id="tab3"><% Html.RenderPartial("Tab3"); %></div>
        </div>

        <div class="submitButtons">
            <input type="button" value="Save Scenario" id="SaveScenario" />
            <input type="button" value="Submit Scenario" id="SubmitScenario" />
        </div>
    </div>
<% } %>
</asp:Content>

部分页面是强类型,与其表示的内容(主要是List<SomeObject>)相对应。

在Scenario模型中,数据应该如何存储?我正在使用SQL数据库,并与Entity Framework进行接口交互。我是否仍需要表示各种项目列表的属性(这样我就可以使用强类型类传递ViewData),还是我可以直接从实体调用中传递ViewData(并根据需要进行转换)?

1个回答

4
您可以在视图中传递任意数量的模型。您只需要创建一个封装模型,其中包含所有要发送的模型即可。
您也可以使用ViewData,但建议使用模型。
您的3个选项卡是否需要整个模型或仅部分内容?
假设您的封装模型中有3个模型,分别命名为tab1、tab2和tab3。
那么,您可以将每个Renderpartial与其相应的模型一起发送,如下所示:
        <div id="tab1"><% Html.RenderPartial("Tab1", Model.tab1); %></div>
        <div id="tab2"><% Html.RenderPartial("Tab2", Model.tab2); %></div>
        <div id="tab3"><% Html.RenderPartial("Tab3", Model.tab3); %></div>

您的封装模型可能看起来像这样:
namespace MVCNAMESPACE.Models {
    public partial class EnCapModel {
        public List<SomeObject> tab1 { get; set; }
        public List<SomeObject> tab2 { get; set; }
        public List<SomeObject> tab3 { get; set; }
    }
}

希望这可以帮助您。

当您使用1(FirstOrDefault)时,您不会得到一个列表,而只是Scenario类型的1个项目。因此,您需要将RenderPartial更改为获取1个Scenario,或者您可以在RenderPartial中执行FirstOrDefault操作。 - Stefanvds
是的...我正在做那个。这是我的部分视图:<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Tab1>" %> - 我感谢你的帮助...这是一个非常奇怪(而且令人沮丧)的问题。 - JasCav
有点奇怪。我只需要为Tab1做这样的事情,而Tab2和Tab3不需要。- <% Html.RenderPartial("Tab1", Model.Scenario.FirstOrDefault<Tab1>()); %> - JasCav
你的tab2和3可能是动态的? - Stefanvds
这个EncapModel将被发送到您在问题中放置代码的“主页面”。所以是的,强类型。EnCapModel.cs文件应该放在ViewModel文件夹中。 - Stefanvds
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接