【问题标题】:Using 2 @model in View - ASP.Net MVC Bootstrap在视图中使用 2 @model - ASP.Net MVC Bootstrap
【发布时间】: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&lt;USR_MSTR&gt;IPagedList&lt;USR_MSTR&gt; 的视图模型(IPagedListIEnumerable)?
  • 您应该拥有一个包含属性string FilterIPagedList&lt;USR_MSTR&gt; 的视图模型,以便您可以将下拉列表绑定到该属性(并且在您返回视图时将被选中(当前你的下拉列表会抛出异常)

标签: c# asp.net-mvc view model asp.net-mvc-5


【解决方案1】:

如果您使用PagedList 作为您的Model,则不必传递原始IEnumerable。只需将分页列表作为模型传递即可。

@model IPagedList<CDS.USR_MSTR>

然后在你的视图代码中,像IEnumerable一样使用它:

@foreach(var item in Model)

【讨论】:

  • 谢谢老兄!但在我的表头中,我在这段代码中有错误:@Html.DisplayNameFor(model =&gt; model.USR_ID)。它说“IPagedList 不包含 USR_ID 的定义,并且找不到接受 IPagedList 类型的第一个参数的扩展方法 USR_ID”
  • 试试:@Html.DisplayNameFor(model =&gt; Model.FirstOrDefault().USR_ID
  • 认为即使列表为空也可以使用,因为它只解析表达式,而不执行它。我现在正在检查。
  • 好的,我验证了它确实可以使用空列表。
  • 成功了!比男人! :D 但是,我仍然会考虑使用 2 个不同的模型来实现视图,我迟早会遇到这种情况。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
相关资源
最近更新 更多