无法让我的 ViewModel 在 MVC 中工作 ASP.NET

Cannot get my ViewModel to work in MVC ASP.NET

我很难让我的视图模型正常工作。作为上下文,我正在使用视图模型来使用另一个项目中的两个模型。这些模型包含用户信息和他们在 localdb 中选择的设备。但是我目前无法使用视图在一个视图上显示来自这两个模型的数据,所以我创建了一个视图模型。

但是我目前收到:

Error: 'System.Collections.Generic.IEnumerable' does not contain a definition for 'UserID' and no extension method 'UserID' accepting a first argument of type 'System.Collections.Generic.IEnumerable' could be found (are you missing a using directive or an assembly reference?)

所有模型对象都会出现此错误。如果我能绕过它,这将是实现功能视图模型的第一步。任何帮助将不胜感激。

User.cs - 模型(在项目中:FaceToFace)

namespace FaceToFace.Model
{
    public class User
    {
        public int UserID { get; set; }
        public string CodeName { get; set; }
        public bool UseBriefInstructions { get; set; }
        public ICollection<RegimeItem> RegimeItems { get; set; }
        public Device Device { get; set; }
        public virtual ICollection<Grading> UserGradings { get; set; }
        public User()
        {
            this.RegimeItems = new List<RegimeItem>();
            Device = new Device();
        }   
    }
    public class RegimeItem
    {
        public int RegimeItemID { get; set; }
        public Exercise RegimeExercise { get; set; }
    }
}

Device.cs - 模型(在项目中:FaceToFace)

namespace FaceToFace.Model
{
    public class Device
    {
        public int DeviceID { get; set; }
        public string Name { get; set; }
    }
}

UserDeviceViewModel.cs(在项目中:FaceToFaceWebsite)

namespace FaceToFaceWebsite.Models
{
    public class UserDeviceViewModel
    {
        public UserDeviceViewModel()
        {
            User = new User();
            Devices = new List<SelectListItem>();
        }
        public User User { get; set; }
        public IList<SelectListItem> Devices { get; set; }
    }
}

PatientController.cs - 只有整个页面的一部分以避免垃圾邮件(项目:FaceToFaceWebsite)

namespace FaceToFaceWebsite.Controllers
{
    public class PatientController : Controller
    {
        private F2FData db = new F2FData();
        public ActionResult Index()
        {
            var viewModel = new List<FaceToFaceWebsite.Models.UserDeviceViewModel>();  
            return View(viewModel);
        }
    }
}

Views/Patient/Index.cshtml(面对面网站)

@model IEnumerable<FaceToFaceWebsite.Models.UserDeviceViewModel>
@*@model FaceToFaceWebsite.Models.UserDeviceViewModel*@
@*@model IEnumerable<FaceToFace.Model.User>*@

<h2>Your Patients</h2>
@*Showing @Model.Count() users*@

<p>@Html.ActionLink("Add New User", "Create")</p>

<table>
    <tr>
        <th>@Html.DisplayNameFor(model => model.UserID)</th>
        <th>@Html.DisplayNameFor(model => model.CodeName)</th>
        <th>@*@Html.DisplayNameFor(model => model.Device.Name)*@Device</th>
        <th>@Html.DisplayNameFor(model => model.DeviceID)</th>
    </tr>
    @foreach (var item in Model)
    {
        <tr>
            <td>@Html.DisplayFor(modelItem => item.UserID)</td>
            <td>@Html.DisplayFor(modelItem => item.CodeName)</td>
            <td>@Html.DisplayFor(modelItem => item.Name)</td>
            <td>@Html.DisplayFor(modelItem => item.DeviceID)</td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id = item.UserID }) |
                @Html.ActionLink("Details", "Details", new { id = item.UserID }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.UserID })
            </td>
        </tr>
    }
</table>

所以我真正需要知道的是,通过使用另一个项目的模型属性,我必须做些什么不同的事情。我目前做错了什么?我应该怎么做才能显示用户信息和设备信息。

更新

感谢 Stephen Muecke,通过将索引控制器中的 Action 结果更改为:

解决了索引视图不显示用户数据库数据的问题
public ActionResult Index()
        {
            var viewModel = db.Users.Select(u => new UserDeviceViewModel() { User = u, Device = u.Device }).ToList();

            return View(viewModel);
        }

移除Ienumerable!

@model FaceToFaceWebsite.Models.UserDeviceViewModel

查看您的控制器:

public ActionResult Index() { var viewModel = new FaceToFaceWebsite.Models.UserDeviceViewModel();

return View(viewModel); }

那么您可以将正确类型的 ViewModel 传递给您的视图:

在您的视图中您有:

@model IEnumerable<FaceToFaceWebsite.Models.UserDeviceViewModel>

在 Controller 中你有:

var viewModel = new FaceToFaceWebsite.Models.UserDeviceViewModel(); 
            return View(viewModel);

尝试传递您的 ViewModel 列表:

var viewModel = new List<FaceToFaceWebsite.Models.UserDeviceViewModel>(); 
            return View(viewModel);

或:

在您的视图中更改为:

@model IEnumerable<FaceToFaceWebsite.Models.UserDeviceViewModel>

收件人:

@model FaceToFaceWebsite.Models.UserDeviceViewModel

为什么会收到错误消息?

因为你的ViewModel没有UserId, CodeName等等

但是您的用户 Class 有 UserId 和 CodeName

因此在 ViewModel 中,您将像这样访问:

ViewModel.User.UserIdViewModel.User.CodeName:

像这样:

<th>@Html.DisplayNameFor(model => model.User.UserID)</th>
<th>@Html.DisplayNameFor(model => model.User.CodeName)</th>

您传递的是 List (IEnumerable<FaceToFaceWebsite.Models.UserDeviceViewModel>) ,而您的视图代码应该是 FaceToFaceWebsite.Models.UserDeviceViewModel

UserDeviceViewModel 包含一个名为 User 而不是 UserID 的 属性(它是 User 的 属性)。你的循环需要

@foreach (var item in Model)
{
    <tr>
        <td>@Html.DisplayFor(m => item.User.UserID)</td>
        <td>@Html.DisplayFor(m => item.User.CodeName)</td>

请注意,您 table headers 在这种情况下不起作用。

另请注意,您并没有真正使用真正的 'view model'。视图模型仅包含视图中 display/edit 所需的那些属性(不仅仅是为了转储其他模型)。根据您显示的视图代码,它应该类似于

public class UserDeviceViewModel
{
    public int UserID { get; set; }
    public string CodeName { get; set; }
    public int DeviceID { get; set; }
    public IList<SelectListItem> Devices { get; set; }
}

尽管您的视图包含对 属性 Name 的引用(不确定这是什么 - 也许是 DeviceName?)并且您的视图不使用 Devices(您是否省略了一些风景?)

根据给定的代码片段,您的视图映射和数据模型未同步。

您可以按照以下步骤操作吗

  1. 清除所有视图。
  2. 先只显示用户等级信息
  3. 验证用户级别信息您可以吗?接下来进行进一步的设备级别
  4. 为您的设备集合设置设备级循环(确保您的设备集合模型不确定您的 "SelectedListItem"