【问题标题】:Adding multiple models on one view using MVC [duplicate]使用 MVC 在一个视图上添加多个模型 [重复]
【发布时间】:2015-04-30 20:37:34
【问题描述】:

我正在尝试将分页添加到我的视图并编辑我的控制器来创建它,但是当我尝试包含 PagedList 模型时我收到一个错误,因为我无法包含我的原始模型。这是我现在的视图:

@model IEnumerable<metric_tool.Models.Metric>
@model PagedList.IPagedList<metric_tool.Models.Metric>
@using PagedList
@{
ViewBag.Title = "Metrics List";
}

<h2>Metrics</h2>

<p>
    @Html.ActionLink("Create New", "Create")

    @using (Html.BeginForm("Index", "Metric", FormMethod.Get))
    {
    <p>
        Category: @Html.DropDownList("metricCategory","All")
        Client: @Html.DropDownList("metricClient","All")
        Phase: @Html.DropDownList("metricPhase","All")
        Hierarchy: @Html.DropDownList("metricHierarchy", "All")
        Thresholds: @Html.DropDownList("metricThreshold", "All") <br />
    </p>
    <p>
        Data Source Search: @Html.TextBox("searchDataSrc") <input type="submit" value="Search" /> 
        Description Search: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string) <input type="submit" value="Search" />
    </p> 
    }

</p>
<table class="table">
    <tr>
        <th>
            @Html.ActionLink("Metric","Index", new { sortOrder = ViewBag.MetricSort, currentFilter=ViewBag.CurrentFilter })
        </th>
        <th>
            @Html.ActionLink("Category", "Index", new { sortOrder = ViewBag.CategorySort, currentFilter = ViewBag.CurrentFilter })
        </th>
        <th>
            @Html.DisplayNameFor(model => model.SelectClient)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.SelectPhase)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.SelectHierarchy)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.SelectDataSource)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.SelectThresholds)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Description)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    .....

</table>
<br />
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount

@Html.PagedListPager(Model, page => Url.Action("Index",
    new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))

我正在考虑使用动态模型,但无法让它工作。

【问题讨论】:

  • 为什么两个都需要,尤其是这个:@model IEnumerable&lt;metric_tool.Models.Metric&gt;这个应该够了`@model PagedList.IPagedList`
  • 如果我需要多个模型,我通常会用我需要的模型构建一个 ViewModel。另外,如果它适合您,请查看一些处理分页等的插件。datatables.net
  • 使用 ViewModel 将两个模型封装成一个。我想给你看代码 sn-p 但不知道为什么我能回答这个问题

标签: asp.net-mvc model-view-controller model asp.net-mvc-5


【解决方案1】:

我实际上是这样做的。我有 PagedViewModel.cs:

using System.Collections.Generic;

namespace App.Web.ViewModels
{
    public class PagedViewModel<T>
    {
        public int      PageNumber  { get; set; }
        public int      PageSize    { get; set; }

        public long     ItemCount   { get; set; }
        public int      PageCount   { get; set; }

        public bool     HasPrevPage { get; set; }
        public bool     HasNextPage { get; set; }

        public List<T>  Items       { get; set; }

        public PagedViewModel()
        {
            Items = new List<T>();
        }
    }

}

我有 PagedResult:

using System;
using System.Collections.Generic;

namespace App.Core.Infrastructure.Common.Paging
{
    public class PagedResult<T>
    {
        public int      PageNumber  { get; set; }
        public int      PageSize    { get; set; }

        public long     ItemCount   { get; set; }
        public int      PageCount   { get; set; }

        public bool     HasPrevPage { get; set; }
        public bool     HasNextPage { get; set; }

        public List<T>  Items       { get; set; }

        public PagedResult(int pageNumber, int pageSize, long totalCount, IEnumerable<T> source)
        {
            Items = new List<T>();
            Items.AddRange(source);

            PageNumber = pageNumber;
            PageSize = pageSize;

            ItemCount = totalCount;
            PageCount = (int)Math.Ceiling(totalCount / (double)pageSize);

            HasPrevPage = PageNumber > 1;
            HasNextPage = PageNumber < PageCount;
        }
    }

}

我的服务有基类:

using App.Core.Infrastructure.Common.Paging;
using App.Core.Models;
using System;
using System.Linq;

namespace App.Core.Infrastructure.Services
{
    public abstract class BaseService
    {
        protected PagedResult<T> GetPagedResult<T>(IQueryable<T> repository, int pageNumber, int pageSize)
            where T : BaseEntity
        {
            pageNumber = Math.Max(1, pageNumber);

            var total = repository.Count();
            var items = repository
                .Skip((pageNumber - 1) * pageSize)
                .Take(pageSize)
                .ToList();

            return new PagedResult<T>(pageNumber, pageSize, total, items);
        }
    }
}

示例服务:

public class PlanService : BaseService
{
    public PagedResult<Plan> GetPlans(int pageNumber, int pageSize)
    {
        return GetPagedResult(_database.Plans.OrderBy(x => x.Id), pageNumber, pageSize);
    }
}

我使用 Automapper 将 PagedResult 转换为 PagedViewModel:

        Mapper.CreateMap<Plan, PlanViewModel>()
            .ForMember(x => x.PlanTypeValue, o => o.MapFrom(s => s.PlanType))
            .ForMember(x => x.PlanTypeText, o => o.MapFrom(s => s.PlanType.ToString()));
        Mapper.CreateMap<PagedResult<Plan>, PagedViewModel<PlanViewModel>>();

在视图中您可以只指定@model PagedViewModel&lt;PlanViewModel&gt;。听起来有点复杂。但是效果很好。

【讨论】:

    猜你喜欢
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 2017-01-15
    • 2015-07-23
    • 2013-01-27
    • 1970-01-01
    相关资源
    最近更新 更多