如何在IPagedlist模型中添加“模型”下拉列表?
我有一个页面来显示html表中的每个日志( 消息,时间,类型,customerId,Name )。 由于日志很大,我在Razor MVC中使用了一个IPagedList,这非常有效。 我目前有2个搜索框(对于管理员)和1个成员。 您可以在哪里搜索消息和客户ID。
现在问题是我不希望用户只有一个文本框,你只能输入一个数字(例如你输入客户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")) { message timestamp level customerId customerName @foreach (var item in Model.Logs) { @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")) { message timestamp level @foreach (var item in Model.Logs) { @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(...`
您还应该考虑添加其他属性,例如sortOrder
和ViewBag
而不是使用ViewBag
附注:确保所有关联的视图(包括主视图)也使用@model yourAssembly.LogModelVM