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

时间:2015-03-17 15:45:57

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

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

但我现在正在接受:

  

错误:'System.Collections.Generic.IEnumerable'不包含'UserID'的定义,并且没有扩展方法'UserID'接受类型'System.Collections.Generic.IEnumerable'的第一个参数可以找到(是你错过了使用指令或程序集引用?)

所有模型对象都发生此错误。如果我可以解决它,它将是功能视图模型的第一步。任何帮助将不胜感激。

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 - 仅限整个页面的一部分以避免垃圾邮件(Project: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);
        }
    }
}

观看/患者/ Index.cshtml(facetofacewebsite)

@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结果更改为:

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

            return View(viewModel);
        }

5 个答案:

答案 0 :(得分:1)

删除Ienumerable!

  

@model FaceToFaceWebsite.Models.UserDeviceViewModel

查看您的控制器:

  

公共ActionResult索引()           {               var viewModel = new   FaceToFaceWebsite.Models.UserDeviceViewModel();

     

return View(viewModel);           }

答案 1 :(得分:1)

您可以将正确类型的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等等。

但您的用户类具有UserId和CodeName

所以在ViewModel中你可以像这样访问:

ViewModel.User.UserIdViewModel.User.CodeName

喜欢这个:

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

答案 2 :(得分:1)

您正在传递列表(IEnumerable<FaceToFaceWebsite.Models.UserDeviceViewModel>),而您的视图代码应为FaceToFaceWebsite.Models.UserDeviceViewModel

答案 3 :(得分:1)

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>

请注意,在这种情况下,表格标题不起作用。

另请注意,您并未真正使用真正的“视图模型”。视图模型仅包含在视图中显示/编辑所需的属性(不仅仅用于转储其他模型)。根据您显示的视图代码,它应该类似于

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(你省略了一些视图吗?)

答案 4 :(得分:-1)

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

您可以按照以下步骤进行操作

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