c# - Asp.net core Sakura.AspNetCore.PagedList 和部分 View

标签 c# asp.net asp.net-core .net-core pagedlist

我现在已经为此苦苦挣扎了太久,我想我终于找到了问题所在!

我正在 Asp.Net Core 网络应用程序中制作评论部分,我添加了 2 个下拉列表以按产品过滤评论,并设置每页评论的数量。

对于分页列表,我使用的是 Sakura.AspNetCore.PagedList。

我正在尝试使用 ajax 返回具有过滤和排序评论的部分 View ,一切顺利,直到模型传回。一开始想不通,后来用chrome,发现500错误,从那里发现resonse有如下错误:

InvalidOperationException: The model item passed into the ViewDataDictionary is of Microsoft.AspNetCore.Mvc.PartialViewResult but this ViewDataDictionary instance requires a model item of type Sakura.AspNetCore.IPagedList

虽然 pagedlist 是一个部分 View ,但我这辈子都想不出如何解决这个问题……这是我模型中代码中有问题的部分:

        public async Task<ActionResult> ShowReviewDetails(string searchProduct, int? page, string perPage)
    {
        // get product via id
        var prodId = Convert.ToInt32(searchProduct);
        var prod = await _context.Product.FindAsync(prodId);
        searchProduct = prod.ProductName;
        if (perPage == "0")
        {
            perPage = _context.Product.Count().ToString();
        }
        var perPageGet = Convert.ToInt32(perPage);
        if (perPageGet <= 0)
        {
            perPageGet = _context.Product.Count();
        }
        int pageSize = Convert.ToInt32(perPageGet);
        int pageNumber = (page ?? 1);

        IEnumerable<Review> reviews = await _context.Review.Where(r => r.ReviewApproved == true).ToListAsync();
        if (!string.IsNullOrWhiteSpace(searchProduct) || !string.IsNullOrEmpty(searchProduct))
        {

            searchProduct = StringExtensions.UppercaseFirst(searchProduct);
        }           
        if (!string.IsNullOrEmpty(searchProduct) || !string.IsNullOrWhiteSpace(searchProduct) || searchProduct == "0")
        {
            page = 1;
            reviews = await _context.Review.Where(r => r.Product == searchProduct && r.ReviewApproved == true).ToListAsync();
        }
        if (searchProduct == "All" || string.IsNullOrEmpty(searchProduct))
        {
            reviews = await _context.Review.Where(r => r.ReviewApproved == true).ToListAsync();
        }

        reviews = reviews.ToPagedList(pageSize, pageNumber);

        return PartialView(reviews);

我对 asp.net core 和 c# 还是很陌生,所以欢迎任何帮助或建议,也许有更好的分页选项?

感谢您的宝贵时间!

编辑:添加 View 和脚本

我的局部 View 父级:

@{
ViewBag.Title = "Review Dashboard";
@using YaCu_2017.Controllers;
}
<p class="green-text">@ViewBag.StatusMessage</p>
<p class="red-text">@ViewBag.ErrorMessage</p>

<h2>Our Product Reviews</h2>

<div class="reviewView" id="filter">
@await Html.PartialAsync("ShowReviewDetails")
</div>

实际的局部 View :

    @model IPagedList<YaCu_2017.Models.Review>
@using System.Globalization
@using Sakura.AspNetCore
@using YaCu_2017.Controllers
@using YaCu_2017.Models
@{
ViewData["Title"] = "Digital Jeeves - Reviews";

}

<div class="row">
<div class="col s2">

    <h5>Filter by Product:</h5>

    <form method="get" >
        @{
            var product = ReviewController.GetProductListIncId();
            var productCount = ReviewController.GetProductCountList();
            ViewBag.ProductList = product;
            ViewBag.ProductCount = productCount;
        }
        <select asp-items="@ViewBag.ProductList" id="searchProduct" class="dropdown-button btn"></select>
        <h5>Reviews per page</h5>
        <select asp-items="@ViewBag.ProductCount" id="perPage" class="dropdown-button btn"></select>
    </form>

</div>
</div>

<div class="row">
    <div class="col s12 center center-align center-block">
        <p>Page @(Model.TotalPage < Model.PageIndex ? 1 : Model.PageIndex) of @Model.TotalPage<pager class="pagination" setting-link-attr-data-ajax="true" /></></p>
    </div>
</div>
<hr />
<div>
@foreach (var item in Model)
{
    var stars = Convert.ToDouble(item.Stars);
    <div class="container opaque-parent z-depth-5">
        <div class="row">
            <div class="col s6"><h6 style="border-bottom:thin">Title : @Html.DisplayFor(model => item.Title)</h6></div>
            <div class="col s3"><h6 style="border-bottom:thin">Product : @Html.DisplayFor(model => item.Product)</h6></div>
            <div class="col s3"><h6 style="border-bottom:thin">Rated: <ej-rating value="@stars" id="@item.Id" read-only="true" /></h6></div>
        </div>
        <div class="row" style="">
            <div class="col s12" style="border-bottom:inset">
                <h6>Comment:</h6>
            </div>
        </div>
        <div class="row" style="border-bottom:inset">
            <div class="col s6 offset-s3">
                <p class="flow-text">"@Html.DisplayFor(model => item.ReviewText)"</p>
            </div>
        </div>
        <div class="row">
            <div class="col s3">
                <p>Date Created : @Html.DisplayFor(modelItem => item.CreatedDate)</p>
            </div>
            <div class="col s3">
                <p>Chosen Display Name: @Html.DisplayFor(modelItem => item.DisplayName)</p>
            </div>
        </div>
    </div>
    <hr />
}
</div>
<div class="row">
<div class="col s12 center center-align center-block">
    <p>Page @(Model.TotalPage < Model.PageIndex ? 1 : Model.PageIndex) of @Model.TotalPage<pager class="pagination" setting-link-attr-data-ajax="true" /></></p>
</div>
</div>

和我的文档准备功能:

     $("#searchProduct").change(function () {
        var product =  $("#searchProduct").val();
        var perPage = $("#perPage").val();
           $("#filter").load('http://LocalHost:50426/Review/GetProducts?searchProduct=' + product + '&perPage=' + perPage);
  });
 $("#perPage").change(function () {
        var product =  $("#searchProduct").val();
        var perPage = $("#perPage").val();
           $("#filter").load('http://LocalHost:50426/Review/GetProducts?searchProduct=' + product + '&perPage=' + perPage);
  });

最佳答案

答案简单得愚蠢,我狠狠地踢了自己一脚,一个星期都不能坐下来!

我只需要将 partialView(GetReviewDetails) 作为 IPagedList 返回。

为了完整起见(这甚至是一个词吗?)这就是它结束时的一切! 意见: 修改索引(父级),因为我正在复制整个页面大声笑:

    @model Sakura.AspNetCore.IPagedList<YaCu_2017.Models.Review>
@{
ViewBag.Title = "Review Dashboard";
@using YaCu_2017.Controllers;
}
<p class="green-text">@ViewBag.StatusMessage</p>
<p class="red-text">@ViewBag.ErrorMessage</p>

<h2>Our Product Reviews</h2>
<div class="row">
<div class="col s2">

    <h5>Filter by Product:</h5>

    <form method="get">
        @{
            var product = ReviewController.GetProductListIncId();
            var productCount = ReviewController.GetProductCountList();
            ViewBag.ProductList = product;
            ViewBag.ProductCount = productCount;
        }
        <select asp-items="@ViewBag.ProductList" id="searchProduct" class="dropdown-button btn"></select>
        <h5>Reviews per page</h5>
        <select asp-items="@ViewBag.ProductCount" id="perPage" class="dropdown-button btn"></select>
    </form>

</div>
</div>

<div class="row">
<div class="col s12 center center-align center-block">
    <p>Page @(Model.TotalPage < Model.PageIndex ? 1 : Model.PageIndex) of @Model.TotalPage<pager class="pagination" setting-link-attr-data-ajax="true" /></></p>
</div>
</div>
<hr />
<div>
<div class="reviewView" id="filter">
    @await Html.PartialAsync("ShowReviewDetails", Model)
</div>
</div>
<div class="row">
<div class="col s12 center center-align center-block">
    <p>Page @(Model.TotalPage < Model.PageIndex ? 1 : Model.PageIndex) of @Model.TotalPage<pager class="pagination" setting-link-attr-data-ajax="true" /></></p>
</div>
</div>

修改后的 ShowReviewDetails (Child/partial) 只有循环:

    @model IPagedList<YaCu_2017.Models.Review>
@using System.Globalization
@using Sakura.AspNetCore
@using YaCu_2017.Controllers
@using YaCu_2017.Models
@{
ViewData["Title"] = "Digital Jeeves - Reviews";

}


@foreach (var item in Model)
{
    var stars = Convert.ToDouble(item.Stars);
    <div class="container opaque-parent z-depth-5">
        <div class="row">
            <div class="col s6"><h6 style="border-bottom:thin">Title : @Html.DisplayFor(model => item.Title)</h6></div>
            <div class="col s3"><h6 style="border-bottom:thin">Product : @Html.DisplayFor(model => item.Product)</h6></div>
            <div class="col s3"><h6 style="border-bottom:thin">Rated: <ej-rating value="@stars" id="@item.Id" read-only="true" /></h6></div>
        </div>
        <div class="row" style="">
            <div class="col s12" style="border-bottom:inset">
                <h6>Comment:</h6>
            </div>
        </div>
        <div class="row" style="border-bottom:inset">
            <div class="col s6 offset-s3">
                <p class="flow-text">"@Html.DisplayFor(model => item.ReviewText)"</p>
            </div>
        </div>
        <div class="row">
            <div class="col s3">
                <p>Date Created : @Html.DisplayFor(modelItem => item.CreatedDate)</p>
            </div>
            <div class="col s3">
                <p>Chosen Display Name: @Html.DisplayFor(modelItem => item.DisplayName)</p>
            </div>
        </div>
    </div>
    <hr />
}

现在是 Controller :

我有一个 GetProducts() Controller ,它用于通过 ajax 加载部分并且是我需要添加 as IPagedList 的地方:

        [HttpGet]
    [AllowAnonymous]
    public async Task<ActionResult> GetProducts(string searchProduct, int? page, string perPage)
    {
        var product = int.Parse(searchProduct);

        var obj = await this.ShowReviewDetails(searchProduct, page, perPage) as IPagedList;
        return PartialView("ShowReviewDetails", obj);
    }

索引控件:

        public async Task<ActionResult> Index(Review model, string sortOrder, string searchString, string searchProduct, int? page, string perPage)
    {

        await ShowReviewDetails(model, sortOrder, searchString, searchProduct, page, perPage);
        return View();
    }

最后是 ShowReviewDetails:

        public async Task<ActionResult> ShowReviewDetails(string searchProduct, int? page, string perPage)
    {
        // get product via id
        var prodId = Convert.ToInt32(searchProduct);

        if (prodId > 0)
        {
            var dbProd = await _context.Product.FindAsync(prodId);
            var prod = new Product()
            {
                Id = dbProd.Id,
                ProductName = dbProd.ProductName,
                Cost = dbProd.Cost,
                ProductCategory = dbProd.ProductCategory,
                ProductDescription = dbProd.ProductDescription,
            };
            searchProduct = prod.ProductName;
        }
        else
        {
            searchProduct = "All";
        }           
        if (perPage == "0")
        {
            perPage = _context.Product.Count().ToString();
        }
        var perPageGet = Convert.ToInt32(perPage);
        if (perPageGet <= 0)
        {
            perPageGet = _context.Product.Count();
        }
        int pageSize = Convert.ToInt32(perPageGet);
        int pageNumber = (page ?? 1);

        IEnumerable<Review> reviews = await _context.Review.Where(r => r.ReviewApproved == true).ToListAsync();
        if (!string.IsNullOrWhiteSpace(searchProduct) || !string.IsNullOrEmpty(searchProduct))
        {

            searchProduct = StringExtensions.UppercaseFirst(searchProduct);
        }           
        if (!string.IsNullOrEmpty(searchProduct) || !string.IsNullOrWhiteSpace(searchProduct) || searchProduct == "0")
        {
            page = 1;
            reviews = await _context.Review.Where(r => r.Product == searchProduct && r.ReviewApproved == true).ToListAsync();
        }
        if (searchProduct == "All" || string.IsNullOrEmpty(searchProduct))
        {
            reviews = await _context.Review.Where(r => r.ReviewApproved == true).ToListAsync();
        }

        reviews = reviews.ToPagedList(pageSize, pageNumber);

        return PartialView(reviews);
    }

关于c# - Asp.net core Sakura.AspNetCore.PagedList 和部分 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42011060/

相关文章:

c# - Azure KeyVault : how to create clientId and clientSecret?

c# - Entity Framework 如何从 Datacontext 中分离所有特定类型的对象?

c# - 如何定义可以返回 DataTable 或 List <T> 的方法?

asp.net - AntiForgery Token 使用 ASP.NET5 Web API,在 NET46 上没有 System.Web.Helpers

asp.net - 尝试使用 Visual Studio 2008 附加到 ASP.NET 进程时出现 "Mixed mode debugging is not supported on Windows 64-bit platforms"

c# - "invalid state change"返回什么 http 状态码

c# - 在 .NET Core 中使用反射

c# - Html.EditorFor 全局模板?

c# - 如何从字符串中删除部分 "http://"?

c# - 比较验证器不会停止回发