Как добавить раскрывающийся список «модель» в модели IPagedlist?

У меня есть страница для отображения каждого журнала ( сообщение, время, тип, customerId, Name ) в таблице html. Поскольку журнал огромен, я использую IPagedList в Razor MVC, и это работает отлично. В настоящее время у меня есть 2 windows поиска (для администраторов) и 1 для участников. Где вы можете искать по сообщению и идентификатору клиента.

Журнал с использованием IPagedList

Теперь проблема заключается в том, что я не хочу, чтобы у пользователей было только текстовое поле, в которое вы можете положить только число (например, вы ввели идентификатор клиента 2 и получите клиента T), но вместо этого я хочу выпадающий список со всеми текущие имена клиентов, подключенные к идентификаторам клиентов.

У меня есть эта функция на другой странице, которую я использую, но она работает только потому, что я возвращаю модель на другой странице и потому, что страница журнала возвращает «IPagedListModel» вместо «Model», я не могу использовать это решение. Как я могу заставить это решение работать и для моей страницы журнала?

HTML-код

@:

@Html.DropDownListFor(m => m.SelectedCustomer, Model.CustomerList)

модель

 using System; using System.Linq; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity; using System.Collections.Generic; using PagedList; using System.Web.Mvc; namespace ASDMVC.Models { [Table("Log")] public class LogModel { [Key] public long id { get; set; } public string message { get; set; } public DateTime timeStamp { get; set; } public string level { get; set; } public int customerId { get; set; } [NotMapped] public string Name { get; set; } } public class LogModelVM { public int SelectedCustomer { get; set; } public IEnumerable CustomerList { get; set; } public string Message { get; set; } public IPagedList Logs { get; set; } } public class LogDBContext:DbContext { public LogDBContext() : base("MySqlConnection") { } public DbSet  Log { get; set; } public IQueryable GetLogs() { return from log in Log select log; } } } 

controller

 public class DbCustomerIds { public List GetCustomerIds() { List Customers = new List(); string queryString = "SELECT * FROM dbo.customers"; SqlDataAdapter adapter = new SqlDataAdapter(queryString, System.Configuration.ConfigurationManager.ConnectionStrings["MySqlConnection"].ConnectionString); DataSet customers = new DataSet(); adapter.Fill(customers, "Customers"); foreach (DataRow item in customers.Tables[0].Rows) { DbCustomer cid = new DbCustomer(); cid.FakeId = Convert.ToInt32(item["Id"]); cid.FakeName = Convert.ToString(item["Name"]); Customers.Add(cid); } return Customers; } } private IEnumerable GetCustomerIds() { var DbCustomerIds = new DbCustomerIds(); var customers = DbCustomerIds .GetCustomerIds() .Select(x => new SelectListItem { Value = x.FakeId.ToString(), Text = x.FakeName }); return new SelectList(customers, "Value", "Text"); } } [HttpPost] public PartialViewResult LogPartialView(string searchString, string searchString2, string currentFilter, string currentFilterz, int? page, string sortOrder) { if (Roles.IsUserInRole(WebSecurity.CurrentUserName, "Admin")) { Customer = GetCustomerIds(); message = db.GetLogs(); int pageSize = 10; int pageNumber = (page ?? 1); var logs = message.OrderByDescending(i => i.timeStamp).ToPagedList(pageNumber, pageSize); foreach (var log in logs) log.Name = Customer.Where(a => a.Value == log.customerId.ToString()).FirstOrDefault().Text; LogModelVM LMVM = new LogModelVM(); LMVM.Logs = logs; LMVM.CustomerList = Customer; return PartialView("_LogPartialLayout", LMVM); } LogModelVM LMVM = new LogModelVM(); LMVM.Logs = logs; LMVM.CustomerList = Customer; return PartialView("_LogPartialLayout", LMVM); } 

_LogPartialLayout

 @model ASDMVC.Models.LogModelVM @using PagedList.Mvc;  @if (Roles.IsUserInRole(WebSecurity.CurrentUserName, "Admin")) {  @foreach (var item in Model.Logs) {  } 
message timestamp level customerId customerName
@Html.DisplayFor(modelItem => item.message) @Html.DisplayFor(modelItem => item.timeStamp) @Html.DisplayFor(modelItem => item.level) @Html.DisplayFor(modelItem => item.customerId) @Html.DisplayFor(modelItem => item.Name)
} @if (Roles.IsUserInRole(WebSecurity.CurrentUserName, "Member")) { @foreach (var item in Model.Logs) { }
message timestamp level
@Html.DisplayFor(modelItem => item.message) @Html.DisplayFor(modelItem => item.timeStamp) @Html.DisplayFor(modelItem => item.level)
} Page @(Model.Logs.PageCount Url.Action("LogPartialView", new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter, currentFilterz = ViewBag.CurrentFilterz }), PagedListRenderOptions.EnableUnobtrusiveAjaxReplacing(PagedListRenderOptions.ClassicPlusFirstAndLast, new AjaxOptions { InsertionMode = InsertionMode.Replace, HttpMethod = "POST", UpdateTargetId = "divLogs" }))

Любая помощь будет воспринята, извините за длинный вопрос – я просто хотел получить всю информацию, которая кажется актуальной для ситуации.

Заранее спасибо.

Текущая ошибка при запуске:

[InvalidOperationException: элемент модели, переданный в словарь, имеет тип «PagedList.PagedList`1 [NowasteWebPortalMVC.Models.LogModel]», но для этого словаря требуется элемент модели типа «NowasteWebPortalMVC.Models.LogModelVM».]

Создайте модель представления с необходимыми свойствами в представлении

 public class LogModelVM { public int SelectedCustomer { get; set; } public IEnumerable CustomerList { get; set; } // suggested name change public string Message { get; set; } // for the message search box? public IPagedList Logs { get; set; } .... // add properties for sortorder etc } 

Затем в методе controllerа инициализируйте новый LogModelVM и назначьте значения (например, model.Logs = logs; ) и верните модель представления, чтобы в представлении вы могли использовать

 @model yourAssembly.LogModelVM .... @Html.DropDownListFor(m => m.SelectedCustomer, Model.CustomerList) // why change the id attribute? .... @Html.PagedListPager(Model.Logs, page => Url.Action(...` 

Вы также должны рассмотреть возможность добавления других свойств, таких как sortOrder и currentfilter а не использование ViewBag

Примечание: убедитесь, что все связанные виды, включая основной вид, также используют @model yourAssembly.LogModelVM