通过部分视图创建多个模型
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);
这实际上取决于您的页面如何与服务器交互,是否所有数据都在单个请求中返回,或者初始请求是否针对本身会发出更多请求的页面。
在实际提出这个问题之前,我已经搜索并尝试了很多次,因为我知道这个问题在各种网站上出现的频率。
然而我是目瞪口呆,或者只是愚蠢,可能是后者。我目前有 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);
这实际上取决于您的页面如何与服务器交互,是否所有数据都在单个请求中返回,或者初始请求是否针对本身会发出更多请求的页面。