所以我想做的就是用我的两个模型进行观察。为此我做了 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; }
}
}
我有一个控制器方法,可以将我的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。希望它能说明我想说的话。实现这一目标的最佳方法是什么?
答案 0 :(得分:1)
没有理由在您的视图中使用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>
答案 1 :(得分:0)
主要问题是你试图遍历你的模型,这是不可迭代的。困扰我的第二件事是你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>
}
答案 2 :(得分:0)
您的模型是一个单独的对象,其中包含枚举,因此需要更改:
@model TimeTrackerProjectV2.Models.TimesheetInfoAndTimeSheet_DetailsViewModel
到
@Html.DisplayFor(model => item.Info.Year)
你不需要foreach循环来引用你的model.Info,因为只有一个,所以第一个foreach循环可以去,你可以简单地改变引用
@Html.DisplayFor(model => model.Info.Year)
到
@foreach (var item in Model)
您的最终foreach循环将从
更改 @foreach (var item in Model.Details)
到
def addMinus(str)
str.gsub(/([A-Z][a-z]+(?=[A-Z]))/, "\\1-")
end
print addMinus('ThisIsMyString'), "\n"