通过部分视图的多个模型

时间:2016-01-05 15:58:12

标签: c# asp.net-mvc twitter-bootstrap asp.net-mvc-partialview

在实际提出这个问题之前,我已经搜索并尝试了很多次,因为我知道这种情况经常发生在各个网站上。

然而,我是笨蛋,或者只是愚蠢,可能是后者。我目前有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 Server数据库中的脚手架创建的。所有其他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我需要帮助从一个单一页面获取多个模型到不同的部分视图。

1 个答案:

答案 0 :(得分:3)

将模型引入视图是从控制器开始的。这取决于您的观点的结构。例如......

如果您对服务器端操作有单个请求,并且当时在父视图中呈现部分视图,那么您的服务器端操作将实例化您的视图模型并以某种方式填充它:

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

然后在父视图中,您将为部分视图提供单个模型。由于您的子模型是集合,我假设您将在循环中渲染它们?像这样的东西?:

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

另一方面,如果您的父视图只是一种本身不需要数据的shell,但是会有AJAX调用来获取子模型,那么你就不要首先需要整体视图模型。 AJAX调用将调用各个动作方法,这些方法将使用自己的局部视图返回自己的模型实例。在他们自己的控制器动作中有类似的东西:

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

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