【问题标题】:PagedList error when passing Data with Viewmodel使用 Viewmodel 传递数据时出现 PagedList 错误
【发布时间】:2011-02-13 15:35:44
【问题描述】:

您好,我想知道是否有人对我在我的 asp.net mvc3 网站中实现 pagedlist 代码 (https://github.com/TroyGoode/PagedList) 时遇到的问题有所了解。这是我正在尝试做的细节:

我使用以下详细信息创建了一个视图模型:

public class ProductViewModelList
{
    public List<Product> ProductBrowse { get; set; }
    public int NumberOfProducts { get; set; } 
    public List<Category> CategoryModel { get; set; } 
}

然后是一个控制器,它保存着我要传递给视图的信息:

public ActionResult List(int categoryid, int? page)
{
    const int defaultPageSize = 20;
    int currentPageIndex = page.HasValue ? page.Value - 1 : 0;
    var categoryModel = db.Category.Include("Product").Single(c => c.CategoryId == categoryid);
    var paginatedmodel = categoryModel.Product.ToPagedList(currentPageIndex, defaultPageSize);
    var viewModel = new ProductViewModelList
    {
        ProductBrowse = paginatedmodel.ToList(),
        NumberOfProducts = categoryModel.Product.Count()
    };
return View(viewModel);

最后是开头的视图:

@inherits System.Web.Mvc.WebViewPage<IPagedList<Social.ViewModels.ProductViewModelList>>
@using Social.Helpers;
@using System.Web.Mvc.Html

并以这种方式使用寻呼机创建一个 foreach:

@foreach (var item in Model)
                {
                    <div class="result">
<div class="info_result"><h2><a>@Html.ActionLink(Html.TruncateText(item.Title, 25), "Details", new { id = item.ProductId })</a></h2><p><a>@Html.ActionLink(Html.TruncateText(item.Description, 180), "Details", new { id = item.ProductId })</a></p<a>@String.Format("{0:dddd, MMMM d, yyyy}", item.CreatedOn)</a></div>

<div class="paginacion">@Html.Pager(Model.PageSize, Model.PageNumber, Model.TotalItemCount)</div>

信息:1-我正在使用

@inherits System.Web.Mvc.WebViewPage<IPagedList<Social.ViewModels.ProductViewModelList>>

因为我需要将信息从 IPagedList 和 ProductViewModelList 传递到视图。

2- 如果我通过 &lt;IPagedList&lt;Social.ViewModels.ProductViewModelList&gt; 之类的继承,我会收到 IPagedList 属性的完整智能感知,但对于 Viewmodels NumberofProducts、ProductBrowse、CategoryModel 我只收到它们的名称,而不是像 ProductBrowse.ProductId 这样的其他属性。

3- 我想显示以下类型的 URL: http://www.domain.com/Controller/List?categoryId=2&page=1

4- 我不知道我必须做什么才能包含

的对象值
Html.Pager(Model.PageSize, Model.PageNumber, Model.TotalItemCount, ObjectValues for categoryId=2)

对不起,如果这是一团糟,我已尽力解释。 提前致谢。

【问题讨论】:

  • 请不要在标题中大喊大叫。
  • 对不起,我不是故意的,我会编辑的。 brgds!

标签: c# asp.net-mvc-3 viewmodel pagedlist


【解决方案1】:

代替:

@inherits System.Web.Mvc.WebViewPage<IPagedList<Social.ViewModels.ProductViewModelList>>

尝试:

@model IPagedList<Social.ViewModels.ProductViewModelList>

您也可以使用显示模板,而不是在视图中编写 foreach 循环。所以在你看来:

<div class="result">
    @Html.DisplayForModel()
</div>
<div class="paginacion">
    @Html.Pager(Model.PageSize, Model.PageNumber, Model.TotalItemCount)
</div>

~/Views/Home/DisplayTemplates/ProductViewModelList.cshtml内部

@model Social.ViewModels.ProductViewModelList
<div class="info_result">
    <h2>
        @Html.ActionLink(
            Html.TruncateText(Model.Title, 25), 
            "Details", 
            new { id = Model.ProductId }
        )
    </h2>
    <p>  
        @Html.ActionLink(
            Html.TruncateText(Model.Description, 180), 
            "Details", 
            new { id = item.ProductId }
        )
    </p>
    <!-- I've modified this to use a display template instead of String.Format
    Now you only need to decorate your view model property with the DisplayFormat attribute like this:
    [DisplayFormat(DataFormatString = "{0:dddd, MMMM d, yyyy}")]
    public DateTime? CreatedOn { get; set; }
    -->
    @Html.DisplayFor(x => x.CreatedOn)
</div>

【讨论】:

  • 感谢您的及时答复。我试过了,但是当我这样做时,我丢失了 ProductViewModelList 属性并且它们没有显示出来。 IPagedList 的属性仍然存在 - 诸如 TotalItemCount 之类的属性,而不是其他属性...
  • @sebastian_h,那是因为您的模型是 IPagedList&lt;T&gt;,而您在主视图中将只有属性 PageSizePageNumberTotalItemCount。只有当您开始枚举或使用我的示例中的显示模板时,您才会看到集合中每个项目的属性。
  • @Darin_Dimitrov 很棒的方法,非常感谢。我做了这些改变,我有智能感知。另一方面,我收到以下错误:传递到字典中的模型项的类型为“Social.ViewModels.ProductViewModelList”,但该字典需要类型为“Social.Helpers.IPagedList`1[Social.ViewModels”的模型项。产品视图模型列表]'。你知道如何从控制器传递 Html.Pager 区域中 categoryId=2 的 ObjectValues 吗? brgds
  • @sebastian_h,我明白了。您的控制器操作返回ProductViewModelList 的实例,而不是IPagedList&lt;ProductViewModelList&gt;。您需要对其进行修改,使其返回正确的视图模型类型。
  • @Darin_Dimitrov 我会看看我能做什么,可能会创建一个对类别的调用。非常感谢您的回复。对我来说,答案揭示了许多方法! brgds
【解决方案2】:

您可以尝试其他库PagedListExt。可以通过nuget-pakage安装

【讨论】:

  • 太好了,您的网页中是否也有 ajax 寻呼机?我查看了您的博客,但俄语对我来说很难,而且翻译不太准确.. 非常感谢您提供更多信息
  • 是的。代码示例可以看我的博客PagedList with Ajax.
猜你喜欢
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2014-12-09
  • 2020-08-01
相关资源
最近更新 更多