在实际提出这个问题之前,我已经搜索并尝试了很多次,因为我知道这种情况经常发生在各个网站上。
然而,我是笨蛋,或者只是愚蠢,可能是后者。我目前有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我需要帮助从一个单一页面获取多个模型到不同的部分视图。
答案 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);
这实际上取决于您的页面如何与服务器交互,是否所有数据都返回到单个请求中,或者初始请求是否适用于本身会产生更多请求的页面。