尝试使用 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)