无法让我的 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.UserId
和 ViewModel.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
(您是否省略了一些风景?)
根据给定的代码片段,您的视图映射和数据模型未同步。
您可以按照以下步骤操作吗
- 清除所有视图。
- 先只显示用户等级信息
- 验证用户级别信息您可以吗?接下来进行进一步的设备级别
- 为您的设备集合设置设备级循环(确保您的设备集合模型不确定您的 "SelectedListItem"
我很难让我的视图模型正常工作。作为上下文,我正在使用视图模型来使用另一个项目中的两个模型。这些模型包含用户信息和他们在 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.UserId
和 ViewModel.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
(您是否省略了一些风景?)
根据给定的代码片段,您的视图映射和数据模型未同步。
您可以按照以下步骤操作吗
- 清除所有视图。
- 先只显示用户等级信息
- 验证用户级别信息您可以吗?接下来进行进一步的设备级别
- 为您的设备集合设置设备级循环(确保您的设备集合模型不确定您的 "SelectedListItem"