我遇到了一个问题,我无法在视图中显示多个模型,特别是在表单中。我到目前为止采用的方法是使用一个父母"视图以保存与各种模型相关的多个局部视图(使用EF6,VS13)。
然而,由于错误的实施或理解,我似乎无法做到这一点,因为我不断得到每个视图只能与一个模型相关的错误。
- 的模型 -
NewHire:
namespace HROnboarding.Domain.Entities
{
public class NewHire
{
public int NewHireId { get; set; }
[Required]
[DisplayName("First Name")]
public string FirstName { get; set; }
[Required]
[DisplayName("Last Name")]
public string LastName { get; set; }
public string Department { get; set; }
public string Position { get; set; }
[DisplayName("Needs Phone")]
public bool NeedsPhone { get; set; }
[DisplayName("Needs Computer")]
public bool NeedsComputer { get; set; } //Enables SoftwareNeeded, External Devices(Keyboard, mouse, docking station, etc), Resource Permission(text box?), Email groups
[DisplayName("Needs Credit Card")]
public bool NeedsCredit { get; set; }
}
}
SoftwareNeeded:
namespace HROnboarding.Domain.Entities
{
public class SoftwareNeeded
{
//Primitive Properties
public int SoftwareNeededId { get; set; }
public string SoftwareName { get; set; } //piece of software (GIMP, VS13, etc)
public bool IsNeeded { get; set; } //whether or not it is needed by the user
}
}
- 控制器 -
NewHireController:
namespace HROnboarding.WebUI.Controllers
{
public class NewHireController : Controller
{
private INewHiresRepository repository;
public NewHireController(INewHiresRepository newHireRepository)
{
//instantiate repository
this.repository = newHireRepository;
}
//
// GET: /NewHire/
public ViewResult Index()
{
return View(repository.NewHires);
}
public ViewResult NewHiresView()
{
return View(repository.NewHires);
}
}
}
注意:还有一个相应的SoftwareController,与NewHireController相同。
这些模型对应于每个模型看起来像这样的接口(存储库):
namespace HROnboarding.Domain.Interfaces
{
public interface INewHiresRepository
{
IEnumerable<NewHire> NewHires { get; }
int SaveNewHire(NewHire newHire);
NewHire GetById(int Id);
}
}
正如我所说,我试图为每个模型使用部分视图:
@model IEnumerable<HROnboarding.Domain.Entities.NewHire>
@if (Model != null)
{
<div>
<table>
<thead>
<tr>
<th>
First Name
</th>
<th>
Last Name
</th>
<th>
Department
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@item.FirstName
.
.
.
我在每个模型中使用其中一个部分视图,通过主索引视图将它们包装到引用中,如下所示:
@using HROnboarding.Domain.Entities
@using HROnboarding.Domain.Interfaces
@model IEnumerable<HROnboarding.Domain.Entities.NewHire>
<h2>List</h2>
<p>
<div>
@Html.Partial("NewHiresView")
</div>
<div>
@*@Html.Partial("Softwares")*@ @*<-------Can't just add this in?*@
</div>
</p>
@*<p>
@Html.ActionLink("Create New", "Create")
</p>*@
@*<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.FirstName)
</th>
<th>
@Html.DisplayNameFor(model => model.LastName)
但是当我将各种部分添加到索引视图中时,我只能添加NewHire。当我添加Softwares视图时,它会抛出一个未处理的异常:
附加信息:传递到字典中的模型项是 类型 &#39; {System.Data.Entity.DbSet {1}} 1 [HROnboarding.Domain.Entities.SoftwareNeeded]&#39;
正如我所说,我必须遗漏一些基本的东西,因为我觉得我太复杂了。也不确定这是不是太多&#34;背景信息,但我希望我的问题很清楚。
答案 0 :(得分:0)
我做同样的事情,唯一的区别我只将一个视图模型传递给我的主视图,然后使用
渲染每个视图模型 @Html.Partial("ViewName", Model)
veiw模型是一些域对象的集合。其中一些视图包含在一个表单中,因此回发完整的模型。和其他人启用ajax,只发送viewModel的部分作为JSON对象。
也许尝试简化您的观点并利用部分
来利用视图模型答案 1 :(得分:0)
您的根本问题是您正在尝试将数据实体用作视图模型。
您有两种选择:
快速而肮脏:通过ViewBag将您的数据实体传递给视图。
<强>&#34;正确&#34; MVC:为每个View创建ViewModel。模型将包括与您的数据实体对应的属性