如何在IPagedlist模型中添加“模型”下拉列表?

我有一个页面来显示html表中的每个日志( 消息,时间,类型,customerId,Name )。 由于日志很大,我在Razor MVC中使用了一个IPagedList,这非常有效。 我目前有2个搜索框(对于管理员)和1个成员。 您可以在哪里搜索消息和客户ID。

使用IPagedList的日志

现在问题是我不希望用户只有一个文本框,你只能输入一个数字(例如你输入客户ID 2并获得客户T) – 但我想要一个所有的下拉列表当前客户名称连接到客户ID。

我在我使用的另一个页面中有这个function,但它只能工作,因为我在另一个页面返回模型,因为日志页面返回“IPagedListModel”而不是“模型”我不能使用此解决方案。 我如何使此解决方案也适用于我的日志页面?

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; } } } 

调节器

 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 } 

然后在控制器方法中,初始化一个新的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(...` 

您还应该考虑添加其他属性,例如sortOrderViewBag而不是使用ViewBag

附注:确保所有关联的视图(包括主视图)也使用@model yourAssembly.LogModelVM