Цель: создать раскрывающееся меню для повторного использования, в котором перечислены администраторы, менеджеры и агенты моего веб-сайта. Эти типы пользователей определяются таблицами .NET Simplemembership webpages_Roles и webpages_UsersInRoles.MVC ViewModel errors
До сих пор: У меня есть таблица UserProfile в моей базе данных, которая имеет 25 столбцов. У меня есть соответствующая модель домена с тем же именем, доступ к которой осуществляется из моего UserContext() EF.
Выпадающее меню нужно только перечислить ПгвЬЫат Пользователя, LastName и UserId так вместо того чтобы работать с полной моделью предметной области, я создали следующий ViewModel:
namespace MyModels.Models.ViewModels
{
public class AdminsAndAgentsListVM
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int UserId { get; set; }
}
}
Затем я добавил следующее к моей учетной записи контроллер (обратите внимание, я не работаю с частичным видом еще):
public ActionResult AdminsAndAgentsList()
{
UsersContext _db = new UsersContext(); //provides me access to UserProfiles data
var admins = Roles.GetUsersInRole("Admin"); //gets users with this role
var viewModel = _db.UserProfiles
.Where(x => admins.Contains(x.UserName)); //Selects users who match UserName list
return View(viewModel);
}
затем я эшафот представление списка и основывают его на строго типизированных ViewModel:
@model IEnumerable<MyModels.Models.ViewModels.AdminsAndAgentsListVM>
@{
ViewBag.Title = "AdminsAndAgentsList";
}
<h2>AdminsAndAgentsList</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.FirstName)
</th>
<th>
@Html.DisplayNameFor(model => model.LastName)
</th>
<th>
@Html.DisplayNameFor(model => model.UserId)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.FirstName)
</td>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.UserId)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
</td>
</tr>
}
</table>
я успешно строить и когда я запускаю веб-страницы, я получаю следующее сообщение об ошибке:
The model item passed into the dictionary is of type'System.Data.Entity.Infrastructure.DbQuery
1[My.Models.UserProfile]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable
1[My.Models.ViewModels.AdminsAndAgentsListVM]'.
Если я воссоздать вид, но сильно ввести его Agains UserProfile, он отлично работает. Итак, как это сделать, чтобы я мог вместо этого использовать TypeModel вместо этого? Приведите примеры, если это возможно. Я новичок в C# и MVC и действительно получаю удовольствие от просмотра кода из первых рук. Очень ценю помощь!
EDIT ----------------------------- Вот объект для UserProfile:
public class UsersContext : DbContext
{
public UsersContext()
: base("DefaultConnection")
{
}
public DbSet<UserProfile> UserProfiles { get; set; }
}
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
[Required]
[ReadOnly(true)]
[DisplayName("SubscriberID")]
public int? SubscriberId { get; set; } //Foreign key
[StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.")]
[Display(Name = "First Name")]
public string FirstName { get; set; }
[StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.")]
[Display(Name = "Last Name")]
public string LastName { get; set; }
//public DateTime DOB { get; set; }
[DataType(DataType.Date)]
public DateTime? DOB { get; set; } //This allows null
public bool? Gender { get; set; }
[Required]
[MaxLength(250)]
[EmailAddress]
public string Email { get; set; }
[MaxLength(250)]
[EmailAddress]
[NotEqualTo("Email", ErrorMessage = "Alt Email and Email cannot be the same.")]
public string AltEmail { get; set; }
[MaxLength(250)]
[EmailAddress]
public string FormEmail { get; set; }
public Address Address { get; set; }
[MaxLength(20)]
public string Telephone { get; set; }
[MaxLength(20)]
public string Mobile { get; set; }
[Required]
[DataType(DataType.Date)]
public DateTime DateAdded { get; set; }
[DataType(DataType.DateTime)]
public DateTime? LastLoginDate { get; set; }
public bool? OffersOptIn { get; set; } //any offers we may have with us or partners
public bool? NewsOptIn { get; set; } //newsletter
public bool? SubscriptionOptIn { get; set; } //account, technical, renewal notices, pp invoices, pp receipts
public bool? OrderOptIn { get; set; } //orders - workflow notices
[DataType(DataType.DateTime)]
public DateTime? LastUpdatedAccountDate { get; set; } //Last time user updated contact info
}
Если force View (viewModel.ToList()); , Я получаю аналогичную ошибку, Элемент модели, переданный в словарь, имеет тип «System.Collections.Generic.List'1 [My.Models.UserProfile]», но для этого словаря требуется элемент модели типа «System.Collections» .Generic.IEnumerable'1 [My.Models.ViewModels.AdminsAndAgentsListVM]. –