Ho seguito un semplice articolo che ho trovato su microsoft su come aggiungere il paging ad un progetto in c #. Questo è l'articolo: https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/sort-filter-page?view=aspnetcore-2.1
Ora, mentre seguivo questo articolo, avevo riscontrato un problema alla fine quando volevo passare i dati alla vista. Permettetemi di condividere parte del mio codice in modo che voi ragazzi potete capirlo meglio:
elenco impaginato che ho ricevuto da microsft:
public class PaginatedList<T> : List<T>
{
public int PageIndex { get; private set; }
public int TotalPages { get; private set; }
public PaginatedList(List<T> items, int count, int pageIndex, int pageSize)
{
PageIndex = pageIndex;
TotalPages = (int)Math.Ceiling(count / (double)pageSize);
this.AddRange(items);
}
public bool HasPreviousPage
{
get
{
return (PageIndex > 1);
}
}
public bool HasNextPage
{
get
{
return (PageIndex < TotalPages);
}
}
public static async Task<PaginatedList<T>> CreateAsync(IQueryable<T> source, int pageIndex, int pageSize)
{
var count = await source.CountAsync();
var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
return new PaginatedList<T>(items, count, pageIndex, pageSize);
}
}
il metodo sul controller che utilizzo:
[HttpGet("search/{option?}/{search}")]
public IActionResult GetSearchData(string option, string search, int? page, string currentFilter)
{
if (search != null)
{
page = 1;
}
else
{
search = currentFilter;
}
SearchViewModel data = new SearchViewModel();
var searchArticle = Mapper.Map<IEnumerable<SearchDataItemViewModel>>(_unitOfWork.Articles.GetByString(search));
data.SearchArticle = searchArticle;
var searchArticle2 = Mapper.Map<IEnumerable<SearchDataItemViewModel>>(_unitOfWork.Articles2.GetByString(search));
data.SearchArticle2 = searchArticle2;
var searchArticle3 = Mapper.Map<IEnumerable<SearchDataItemViewModel>>(_unitOfWork.Articles3.GetByString(search));
data.SearchArticle3 = searchArticle3;
var searchArticle4 = Mapper.Map<IEnumerable<SearchDataItemViewModel>>(_unitOfWork.Articles4.GetByString(search));
data.SearchArticle4 = searchArticle4;
int pageSize = 10;
//return View("Search", Helpers.PaginatedList<SearchDataItemViewModel>.CreateAsync(data, page ?? 1, pageSize));
//this is where I got an error
}
l'errore che ho ricevuto è:
Argomento 1: impossibile convertire da "Website.ViewModels.SearchViewModel" a System.Linq.IQueryable <Website.ViewModels.SearchDataItemViewModel>
Anche questo è un esempio di uno dei miei querys:
public IEnumerable<Article2> GetByString(string word)
{
IEnumerable<Article2> article2 = _appContext.Article2
.Include(t => t.ParentPage)
.Where(t => t.Status == RecordStatus.Enabled && (t.Name.Contains(word) || t.Description.Contains(word)));
return article2;
}
In realtà capisco cosa significa, ma come posso passare la variabile "data" sulla vista in modo che io possa usarla?
Sono un po 'bloccato qui, quindi qualsiasi aiuto ragazzi sarebbe molto apprezzato. Almeno indicami la direzione giusta o qualcosa del genere.
Grazie per l'ora !!!
Risolto. Quello che ho fatto è stato modificare il controller in questo modo.
[HttpGet("search/{option?}/{search}")]
public IActionResult GetSearchData(string option, string search, int? page, string currentFilter)
{
if (search != null)
{
page = 1;
}
else
{
search = currentFilter;
}
SearchViewModel data = new SearchViewModel();
int pageSize = 10;
IEnumerable<SearchDataItemViewModel> searchArticle = Mapper.Map<IEnumerable<SearchDataItemViewModel>>(_unitOfWork.Articles.GetByString(search));
var searchArticleP = Helpers.PaginatedList<SearchDataItemViewModel>.CreateAsync(searchArticle, page ?? 1, pageSize);
data.SearchArticle = searchArticleP;
IEnumerable<SearchDataItemViewModel> searchArticle2 = Mapper.Map<IEnumerable<SearchDataItemViewModel>>(_unitOfWork.Articles2.GetByString(search));
var searchArticleP2 = Helpers.PaginatedList<SearchDataItemViewModel>.CreateAsync(searchArticle2, page ?? 1, pageSize);
data.SearchArticle2 = searchArticleP2;
return View("Search", data));
}
Nella tua istruzione Linq manca di specificare come selezionare in modo che restituisca un oggetto Linq; invece di un oggetto Articolo2; dovrebbe assomigliare a questo:
public IEnumerable<Article2> GetByString(string word)
{
IEnumerable<Article2> article2 = _appContext.Article2
.Include(t => t.ParentPage)
.Where(t => t.Status == RecordStatus.Enabled && (t.Name.Contains(word) || t.Description.Contains(word))).ToList();
return article2;
}
aggiungi ToList()