【发布时间】:2016-11-24 11:21:05
【问题描述】:
我有一个直接从数据库表中获取模型的视图。我使用@model IEnumerable<TestMVC.USR_MSTR> 在<table> 中显示数据。现在,我正在尝试实现从教程 (@model PagedList.IPagedList<CDS.USR_GRP_MSTR>) 中阅读的表格分页。它使用不同类型的相同模型,所以现在我遇到了如何在我的视图中附加不同类型的相同模型的问题。
我读到我应该创建一个ViewModel 来调用我需要的模型,但我对 MVC 还是很陌生,并且在某些领域仍然感到困惑。我为此创建了一个 UserViewModel,但不确定我是否正确实现了它,因为在我的视图中我无法获取我的 USR_MSTR 模型的列,所以我恢复到下面发布的代码。
查看(索引.cshtml)
@model IEnumerable<TestMVC.USR_MSTR>
@*@model PagedList.IPagedList<CDS.USR_GRP_MSTR>*@
@using PagedList.Mvc;
@using (Html.BeginForm("Index", "User", FormMethod.Get))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<div class="container">
@Html.DropDownList("UserFilter")
<table id="dbTable" onclick="gettabledata('dbTable','dbBody','0')" class="table table-scroll table-condensed table-hover table-striped bootgrid-table" aria-busy="false">
<thead>
<tr>
<th class="hidden">
@Html.DisplayNameFor(model => model.USR_ID)
</th>
<th>
@Html.ActionLink("Users", "Index", new { sortOrder = ViewBag.UserSort, currentFilter = ViewBag.CurrentFilter })
@*This is to create a link that sorts the Users in descending*@
</th>
</tr>
</thead>
<tbody id="dbBody">
@foreach (var item in Model)
{
<tr>
<td class="hidden">
@Html.DisplayFor(modelItem => item.USR_ID)
</td>
<td>
@Html.DisplayFor(modelItem => item.USR_DESC)
</td>
</tr>
}
</tbody>
</table>
</div>
}
控制器(UserController.cs)
using TestMVC.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using PagedList;
namespace MVCTest.Controllers
{
public class UserController : Controller
{
MVCTestEntities _db = new MVCTestEntities();
// GET: User
public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)
{
ViewBag.CurrentSort = sortOrder;
ViewBag.UserSort = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewBag.DateSort = sortOrder == "Date" ? "date_desc" : "Date";
if (searchString != null)
{
page = 1;
}
else
{
searchString = currentFilter;
}
ViewBag.CurrentFilter = searchString;
var users = from u in _db.USR_MSTR
select u;
if (!String.IsNullOrEmpty(searchString))
{
users = users.Where(s => s.USR_DESC.Contains(searchString));
}
switch (sortOrder)
{
case "name_desc":
users = users.OrderByDescending(ug => u.USR_DESC);
break;
case "Date":
users = users.OrderBy(ug => u.CREA_DT);
break;
case "date_desc":
users = users.OrderByDescending(ug => u.CREA_DT);
break;
default:
users = users.OrderBy(ug => u.USR_DESC);
break;
}
int pageSize = 10;
int pageNumber = (page ?? 1);
var filters = GetUserGroupFilter();
ViewBag.UserGroupFilter = GetSelectListItems(filters);
return View(users.ToPagedList(pageNumber, pageSize));
}
}
}
模型视图 (UserViewModel.cs) - 这是我感到困惑的地方,我是否正确实施了它?我只是在我的视图中获取了 2 个@models 并将其放在这里,以便这是我的视图应该调用的唯一一个
namespace TestMVC.ViewModels
{
public class UserViewModel
{
public IEnumerable<CDS.USR_MSTR> table { get; set; }
public PagedList.IPagedList<CDS.USR_MSTR> pagination { get; set; }
}
}
【问题讨论】:
-
是什么让您认为您需要一个带有
IEnumerable<USR_MSTR>和IPagedList<USR_MSTR>的视图模型(IPagedList是IEnumerable)? -
您应该拥有一个包含属性
string Filter和IPagedList<USR_MSTR>的视图模型,以便您可以将下拉列表绑定到该属性(并且在您返回视图时将被选中(当前你的下拉列表会抛出异常)
标签: c# asp.net-mvc view model asp.net-mvc-5