我有很多困难让我的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);
}
答案 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.UserId
和ViewModel.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)
根据给定的代码段,您的视图映射和数据模型不会同步。
您可以按照以下步骤进行操作