2017-02-02 8 views
3

Я слишком долго боролся с этим, и я думаю, что я наконец нашел, где проблема!Asp.net core Sakura.AspNetCore.PagedList и частичные представления

Я делаю раздел обзора в веб-приложении Asp.Net Core, я добавил 2 раскрывающихся списка, которые фильтруют отзывы по продукту и задают количество отзывов на странице.

Для выгружаемого списка я использую Sakura.AspNetCore.PagedList.

Я пытаюсь использовать ajax для возврата частичного представления, которое имеет отфильтрованные и отсортированные обзоры, и все идет хорошо, пока модель не будет возвращена. Сначала я не мог понять, то, используя хром, я нашел ошибку 500, и оттуда нашли следующую ошибку в resonse:

InvalidOperationException: Модель элемент передается в ViewDataDictionary имеет Microsoft. AspNetCore.Mvc.PartialViewResult но ViewDataDictionary экземпляр требует модель элемента типа Sakura.AspNetCore.IPagedList

Я не могу за жизнь мне понять, как это исправить, модель хотя и pagedlist является PartialView ... вот оскорбительная часть кода в моей модели:

 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 и C#, поэтому любая помощь или предложения будут приветствоваться, возможно, есть лучший вариант для подкачки?

Спасибо за ваше время!

EDIT: добавлен вид и скрипт

Мой частичный вид родителя:

@{ 
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> 

Фактическое PartialView:

@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); 
    }); 
+0

Как вы обработки это в стороне клиента и в частичном виде ShowReviewDetails? – dime2lo

+0

@ dime2lo Я обновил свой вопрос, чтобы включить остальную часть связанного кода –

+0

Ошибка возникает во время первого рендеринга или сразу после попытки изменить страницу? Я имею в виду, можете ли вы получить доступ к главной странице (родитель неполного представления) без ошибок? – dime2lo

ответ

2

Против r был тупо прост, я так сильно ударил себя, что не буду сидеть неделю!

Мне просто нужно было вернуть partialView (GetReviewDetails) как IPagedList.

Ради полноты (это даже слово?) Здесь все, как только оно закончилось! Просмотров: Модифицированный индекс (Parent), как я дублирующие целую страницу лол:

@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 (Ребенок/частичное) имеет только цикл:

@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 /> 
} 

Теперь контроллеры:

У меня есть контроллер GetProducts(), который используется для загрузки частичного через ajax и где мне нужно было добавить как 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); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^