尝试使用 2 个模型创建视图会出错
Trying to create view with 2 models gives error
所以我想做的是用我的两个模型制作一个视图。为此,我做了这个 viewmodel:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace TimeTrackerProjectV2.Models
{
public class TimesheetInfoAndTimeSheet_DetailsViewModel
{
public IEnumerable<TimeSheet_Details> Details { get; set; }
public TimeSheetInfo Info { get; set; }
}
}
我有一个 controller 方法,returns 我的 viewmodel 到我的视图是这样的:
public ActionResult Edit(int id)
{
var inf = Repositories.TimeSheetRepository.GetTimesheetInfo(id);
var time = Repositories.Timesheet_DetailsRepo.GetTimeSheetThroughId(id);
var model = new TimesheetInfoAndTimeSheet_DetailsViewModel { Details = time.ToList(), Info = inf };
return View(model);
}
我的视图目前看起来像这样:
@model IEnumerable<TimeTrackerProjectV2.Models.TimesheetInfoAndTimeSheet_DetailsViewModel>
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<dl class="dl-horizontal">
@foreach (var item in Model)
{
<dt>
Month
</dt>
<dd>
@Html.DisplayFor(model =>)
</dd>
<dt>
Year
</dt>
<dd>
@Html.DisplayFor(model => item.Info.Year)
</dd>
<dt>
Year
</dt>
<dd>
@Html.DisplayFor(model => item.Info.Year)
</dd>
<dt>
Status
</dt>
<dd>
@Html.DisplayFor(model => item.Info.StatusUnparsed)
</dd>
<dt>
User
</dt>
<dd>
@Html.DisplayFor(model => item.Info.EmailUser)
</dd>
<dt>
Explanation
</dt>
<dd>
@Html.DisplayFor(model => item.Info.Explanation)
</dd>
}
}
</dl>
<table class="table">
<tr>
<th>
Date
</th>
<th>
Project
</th>
<th>
Task
</th>
<th>
Time Spent
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
foreach( var i in item.Details)
{
<tr>
<td>
@Html.DisplayFor(modelItem => i.DayOfMonth )
</td>
<td>
@Html.DisplayFor(modelItem => i.Project)
</td>
<td>
@Html.DisplayFor(modelItem => i.Task)
</td>
<td>
@Html.DisplayFor(modelItem => i.TimeSpent)
</td>
</tr>
}
}
</table>
我收到一个错误,因为我传递了一个 ModelView 对象,而我的视图需要枚举。但是当我改变以便我的视图需要一个对象时,我不能在我的 ViewModel 中调用我的对象实体的值,因为我不能再用我的 viewmodel 做一个 foreach。希望它能理解我想说的。实现此目标的最佳方法是什么?
Where i got my controller code example from
没有理由在您看来使用 IEnumerable 声明。
只需将这些行放在您的视图页面中:
@model TimesheetInfoAndTimeSheet_DetailsViewModel
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<dl class="dl-horizontal">
@foreach (var item in Model.Details)
{
<dt>
Month
</dt>
<dd>
@Html.DisplayFor(model => item.Info.Month)
</dd>
<dt>
Year
</dt>
<dd>
@Html.DisplayFor(model => item.Info.Year)
</dd>
<dt>
Year
</dt>
<dd>
@Html.DisplayFor(model => item.Info.Year)
</dd>
<dt>
Status
</dt>
<dd>
@Html.DisplayFor(model => item.Info.StatusUnparsed)
</dd>
<dt>
User
</dt>
<dd>
@Html.DisplayFor(model => item.Info.EmailUser)
</dd>
<dt>
Explanation
</dt>
<dd>
@Html.DisplayFor(model => item.Info.Explanation)
</dd>
}
</dl>
<table class="table">
<tr>
<th>
Date
</th>
<th>
Project
</th>
<th>
Task
</th>
<th>
Time Spent
</th>
<th></th>
</tr>
@foreach (var item in Model.Details)
{
<tr>
<td>
@Html.DisplayFor(modelItem => i.DayOfMonth )
</td>
<td>
@Html.DisplayFor(modelItem => i.Project)
</td>
<td>
@Html.DisplayFor(modelItem => i.Task)
</td>
<td>
@Html.DisplayFor(modelItem => i.TimeSpent)
</td>
</tr>
}
</table>
主要问题是您正在尝试迭代不可迭代的模型。困扰我的第二件事是你 DisplayFor
没有引用任何东西(在月份标签旁边)。
我不确切知道你想要实现什么,但你的代码有几个错误,但请尝试更改以下内容(为简洁起见,我省略了一些代码):
<dl class="dl-horizontal">
<dt>
Year
</dt>
<dd>
@Html.DisplayFor(model => model.Info.Year)
</dd>
</dl>
foreach(var detail in model.Details)
{
<tr>
<td>
@Html.DisplayFor(x=> detail.DayOfMonth)
</td>
<td>
@Html.DisplayFor(x=> detail.Project)
</td>
</tr>
}
您的模型是一个包含枚举的单个对象,因此需要更改:
@model IEnumerable<TimeTrackerProjectV2.Models.TimesheetInfoAndTimeSheet_DetailsViewModel>
到
@model TimeTrackerProjectV2.Models.TimesheetInfoAndTimeSheet_DetailsViewModel
您不需要 foreach 循环来引用您 model.Info 因为只有一个,所以第一个 foreach 循环可以运行,您可以简单地从
更改引用
@Html.DisplayFor(model => item.Info.Year)
到
@Html.DisplayFor(model => model.Info.Year)
您的最终 foreach 循环将从
@foreach (var item in Model)
到
@foreach (var item in Model.Details)
所以我想做的是用我的两个模型制作一个视图。为此,我做了这个 viewmodel:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace TimeTrackerProjectV2.Models
{
public class TimesheetInfoAndTimeSheet_DetailsViewModel
{
public IEnumerable<TimeSheet_Details> Details { get; set; }
public TimeSheetInfo Info { get; set; }
}
}
我有一个 controller 方法,returns 我的 viewmodel 到我的视图是这样的:
public ActionResult Edit(int id)
{
var inf = Repositories.TimeSheetRepository.GetTimesheetInfo(id);
var time = Repositories.Timesheet_DetailsRepo.GetTimeSheetThroughId(id);
var model = new TimesheetInfoAndTimeSheet_DetailsViewModel { Details = time.ToList(), Info = inf };
return View(model);
}
我的视图目前看起来像这样:
@model IEnumerable<TimeTrackerProjectV2.Models.TimesheetInfoAndTimeSheet_DetailsViewModel>
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<dl class="dl-horizontal">
@foreach (var item in Model)
{
<dt>
Month
</dt>
<dd>
@Html.DisplayFor(model =>)
</dd>
<dt>
Year
</dt>
<dd>
@Html.DisplayFor(model => item.Info.Year)
</dd>
<dt>
Year
</dt>
<dd>
@Html.DisplayFor(model => item.Info.Year)
</dd>
<dt>
Status
</dt>
<dd>
@Html.DisplayFor(model => item.Info.StatusUnparsed)
</dd>
<dt>
User
</dt>
<dd>
@Html.DisplayFor(model => item.Info.EmailUser)
</dd>
<dt>
Explanation
</dt>
<dd>
@Html.DisplayFor(model => item.Info.Explanation)
</dd>
}
}
</dl>
<table class="table">
<tr>
<th>
Date
</th>
<th>
Project
</th>
<th>
Task
</th>
<th>
Time Spent
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
foreach( var i in item.Details)
{
<tr>
<td>
@Html.DisplayFor(modelItem => i.DayOfMonth )
</td>
<td>
@Html.DisplayFor(modelItem => i.Project)
</td>
<td>
@Html.DisplayFor(modelItem => i.Task)
</td>
<td>
@Html.DisplayFor(modelItem => i.TimeSpent)
</td>
</tr>
}
}
</table>
我收到一个错误,因为我传递了一个 ModelView 对象,而我的视图需要枚举。但是当我改变以便我的视图需要一个对象时,我不能在我的 ViewModel 中调用我的对象实体的值,因为我不能再用我的 viewmodel 做一个 foreach。希望它能理解我想说的。实现此目标的最佳方法是什么?
Where i got my controller code example from
没有理由在您看来使用 IEnumerable 声明。 只需将这些行放在您的视图页面中:
@model TimesheetInfoAndTimeSheet_DetailsViewModel
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<dl class="dl-horizontal">
@foreach (var item in Model.Details)
{
<dt>
Month
</dt>
<dd>
@Html.DisplayFor(model => item.Info.Month)
</dd>
<dt>
Year
</dt>
<dd>
@Html.DisplayFor(model => item.Info.Year)
</dd>
<dt>
Year
</dt>
<dd>
@Html.DisplayFor(model => item.Info.Year)
</dd>
<dt>
Status
</dt>
<dd>
@Html.DisplayFor(model => item.Info.StatusUnparsed)
</dd>
<dt>
User
</dt>
<dd>
@Html.DisplayFor(model => item.Info.EmailUser)
</dd>
<dt>
Explanation
</dt>
<dd>
@Html.DisplayFor(model => item.Info.Explanation)
</dd>
}
</dl>
<table class="table">
<tr>
<th>
Date
</th>
<th>
Project
</th>
<th>
Task
</th>
<th>
Time Spent
</th>
<th></th>
</tr>
@foreach (var item in Model.Details)
{
<tr>
<td>
@Html.DisplayFor(modelItem => i.DayOfMonth )
</td>
<td>
@Html.DisplayFor(modelItem => i.Project)
</td>
<td>
@Html.DisplayFor(modelItem => i.Task)
</td>
<td>
@Html.DisplayFor(modelItem => i.TimeSpent)
</td>
</tr>
}
</table>
主要问题是您正在尝试迭代不可迭代的模型。困扰我的第二件事是你 DisplayFor
没有引用任何东西(在月份标签旁边)。
我不确切知道你想要实现什么,但你的代码有几个错误,但请尝试更改以下内容(为简洁起见,我省略了一些代码):
<dl class="dl-horizontal">
<dt>
Year
</dt>
<dd>
@Html.DisplayFor(model => model.Info.Year)
</dd>
</dl>
foreach(var detail in model.Details)
{
<tr>
<td>
@Html.DisplayFor(x=> detail.DayOfMonth)
</td>
<td>
@Html.DisplayFor(x=> detail.Project)
</td>
</tr>
}
您的模型是一个包含枚举的单个对象,因此需要更改:
@model IEnumerable<TimeTrackerProjectV2.Models.TimesheetInfoAndTimeSheet_DetailsViewModel>
到
@model TimeTrackerProjectV2.Models.TimesheetInfoAndTimeSheet_DetailsViewModel
您不需要 foreach 循环来引用您 model.Info 因为只有一个,所以第一个 foreach 循环可以运行,您可以简单地从
更改引用@Html.DisplayFor(model => item.Info.Year)
到
@Html.DisplayFor(model => model.Info.Year)
您的最终 foreach 循环将从
@foreach (var item in Model)
到
@foreach (var item in Model.Details)