.NetCore 2.0 - MVC查看错误 - IEnumerable

时间:2018-04-18 08:41:00

标签: c# asp.net-core-mvc

我正在创建一个基本的CRUD应用程序。在我的详细信息视图中,我按照屏幕截图显示错误。

enter image description here

我创建了一个ViewModel来显示我的索引视图。 (多个成员)。我正在尝试重用该ViewModel来显示Details视图(单个成员)。

有人能发现我做错了吗:

这是我的详细信息视图:

    @model IEnumerable<GymTracker.ViewModel.MemberViewModel>

@{
    ViewData["Title"] = "Details";
}

<h2>Details</h2>

@foreach (var item in Model)
{

    <div>
        <h4>Member</h4>
        <hr />
        <dl class="dl-horizontal">



            <dt>
                @Html.DisplayNameFor(model => model.FirstName)
            </dt>
            <dd>
                @Html.DisplayFor(modelItem => item.FirstName)
            </dd>
            <dt>
                @Html.DisplayNameFor(model => model.LastName)
            </dt>
            <dd>
                @Html.DisplayFor(modelItem => item.LastName)
            </dd>
            <dt>
                @Html.DisplayNameFor(model => model.DateOfBirth)
            </dt>
            <dd>
                @Html.DisplayFor(modelItem => item.DateOfBirth)
            </dd>
            <dt>
                @Html.DisplayNameFor(model => model.PaymentType)
            </dt>
            <dd>
                @Html.DisplayFor(modelItem => item.PaymentType)
            </dd>

        </dl>
    </div>
    <div>
        <a asp-action="Edit" asp-route-id="@Model.MemberID">Edit</a> |
        <a asp-action="Index">Back to List</a>
    </div>
}

这是我在控制器中的详细信息操作方法:

 public async Task<IActionResult> Details(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        List<MemberViewModel> memberViewModel = new List<MemberViewModel>(); //declared my VIewModel instance

        var listData = await (from member in _context.Members
                              where (member.Id == id)
                              join membershiptypes in _context.MembershipTypes on member.MembershipTypeId equals membershiptypes.MembershipTypeId
                              select new
                              {
                                  member.Id,
                                  member.FirstName,
                                  member.LastName,
                                  member.DateOfBirth,
                                  membershiptypes.PaymentType
                              }
                              ).ToListAsync();

        listData.ForEach(x =>
        {
            MemberViewModel Obj = new MemberViewModel();
            Obj.MemberID = x.Id;
            Obj.FirstName = x.FirstName;
            Obj.LastName = x.LastName;
            Obj.DateOfBirth = x.DateOfBirth;
            Obj.PaymentType = x.PaymentType;
            memberViewModel.Add(Obj);


        }


        );

        //link the viewModel instance to the context class somehow..


        return View(memberViewModel);
    }

最后,这是我用于详细信息和索引视图的ViewModel:

  namespace GymTracker.ViewModel
{
    public class MemberViewModel
    {
        public int MemberID { get; set; }
        public string FirstName { get; set; }

        public string LastName { get; set; }

        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
        public DateTime DateOfBirth { get; set; }

        public string PaymentType { get; set; }


    }
}

非常感谢任何帮助,谢谢

3 个答案:

答案 0 :(得分:2)

在您的视图中,您希望ListView of MemberViewModel是您的@Model,您正试图访问导致问题的MemberViewModel列表上的MemberID

您可能需要做类似的事情

<a asp-action="Edit" asp-route-id="@item.MemberID">Edit</a>

或者,如果要为所有表项设置第一个MemberID。试试这个:

<a asp-action="Edit" asp-route-id="@Model.FirstOrDefault().MemberID">Edit</a>

答案 1 :(得分:1)

尝试

<a asp-action="Edit" asp-route-id="@item.MemberID">Edit</a> |

您的ModelMemberViewModel的IEnumerable,因此它没有MemberID属性。您为每个循环渲染了该链接,因此您需要使用item变量

答案 2 :(得分:0)

Model这里是序列(IEnumerable<T>); IEnumerable<T> 确实没有该属性@Model.MemberID) - 但序列中的每个项目可能

你可能意味着:

@item.MemberID

或者,如果你真的打算回去整个项目序列,你需要使用类似的东西:

@foreach(var x in Model) {
    // do something with x
}

或者只是

@(Model.First().MemberID)

或类似的