Ошибка PagedList при передаче данных с помощью Viewmodel - PullRequest
1 голос
/ 13 февраля 2011

Привет, мне было интересно, пролил ли кто-нибудь свет на проблему, с которой я сталкиваюсь при реализации кода pagedlist (https://github.com/TroyGoode/PagedList) на моем сайте asp.net mvc3. Вот детали того, что я пытаюсь сделать:

Я создал Viemodel с этими деталями:

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 - Если я передаю наследование, например <IPagedList<Social.ViewModels.ProductViewModelList>, я получаю полное значение intellisense для свойств 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)

Извините, если это беспорядок, чтобы понять, я старался изо всех сил, чтобы объяснить. заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 13 февраля 2011

Вместо:

@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>
1 голос
/ 08 августа 2011

Вы можете попробовать другую библиотеку PagedListExt .Может быть установлен nuget-pakage

...