通过部分视图创建多个模型

Multiple Models Through Partial Views

在实际提出这个问题之前,我已经搜索并尝试了很多次,因为我知道这个问题在各种网站上出现的频率。

然而我是目瞪口呆,或者只是愚蠢,可能是后者。我目前有 4 个模型,我知道我需要将它们组合成一个 ViewModel。

namespace AssetRegistration.Models
{
    public class ComboClassViewModel
    {
        public List<AttributeType> AttributeType { get; set; }
        public List<Location> Locations { get; set; }
        public List<Make> Makes { get; set; }
        public List<User> Users { get; set; }
    }
}

以上是我对该 ViewModel 的尝试,只是为了确保到目前为止它是正确的,这里是它使用的模型之一。注意:此模型是通过 SQL 服务器数据库的脚手架创建的。所有其他 3 个模型都遵循相同的外观。

namespace AssetRegistration.Models
{
    using System;
    using System.Collections.Generic;

    public partial class AttributeType
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",     "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public AttributeType()
        {
            this.Attributes = new HashSet<Attribute>();
        }

        public System.Guid AttributeTypeID { get; set; }
        public string AttributeType1 { get; set; }
        public Nullable<System.DateTime> DateCreated { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",     "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Attribute> Attributes { get; set; }
    }
}

我在主页 Index.cshtml 上使用 Bootstrap 标签,然后每个标签使用: @Html.Partial("") 渲染每个模型对应的页面。

以下是这些部分之一的示例:

@model AssetRegistration.Models.ComboClassViewModel 
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2> 
<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            Attribute Type
        </th>
        <th>
            Date Created
        </th>
        <th></th>
   </tr>

    @foreach (var attribute in Model.AttributeType) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => attribute.AttributeType1)
            </td>
            <td>
                @Html.DisplayFor(modelItem => attribute.DateCreated)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=attribute.AttributeTypeID }) |
                @Html.ActionLink("Details", "Details", new { id=attribute.AttributeTypeID }) |
                @Html.ActionLink("Delete", "Delete", new {  id=attribute.AttributeTypeID })
            </td>
        </tr>
    } 
    </table>

我需要一些有用的指导,我目前是一名实习程序员,所以我的知识有限,请在回复时记住这一点,尽管我会尽力跟上你的步伐。

TL;DR 我需要帮助将多个模型从一个单独的页面获取到不同的局部视图。

让模型进入视图是从控制器开始的事情。这取决于你的观点是如何构成的。例如...

如果您有一个 server-side 操作请求,并且当时在父视图中呈现部分视图,那么您的 server-side 操作将实例化您的视图模型并将其填充到某种方式:

var model = new ComboClassViewModel();
// set all of its properties here
return View(model);

然后在您的父视图中,您将为部分视图提供单独的模型。由于您的 sub-models 是集合,我假设您会循环渲染它们?是这样的吗?:

@foreach (var location in Model.Locations)
    Html.Partial("SomeLocationPartialView", location)

另一方面,如果你的父视图只是一种shell,它本身不需要数据,但是会有AJAX 调用获取 sub-models,那么您首先不需要整体视图模型。 AJAX 调用将调用单独的操作方法,这些方法将 return 具有自己的局部视图的模型实例。在他们自己的控制器操作中是这样的:

var model = new Location();
// set its properties here
return PartialView(model);

这实际上取决于您的页面如何与服务器交互,是否所有数据都在单个请求中返回,或者初始请求是否针对本身会发出更多请求的页面。