How to pass viewmodel to PagedList
Here's a complete newbie to C # MVC who needs some help. I am stuck with passing viewmodel data to PagedList. What am I doing wrong? The error message in the controller I am getting:
Cannot implicitly convert type 'PagedList.IPagedList' to 'PagedList.IPagedList'. Explicit conversion exists (are you missing the listing?)
I have checked a ton of other posts on this subject but could not solve my problem.
Here is my view model:
public partial class NaloziViewModel
{
public int IDNalozi { get; set; }
public int KlijentID { get; set; }
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy HH:mm}", ApplyFormatInEditMode = true)]
public DateTime VremeStart { get; set; }
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy HH:mm}", ApplyFormatInEditMode = true)]
public DateTime? VremeKraj { get; set; }
public int KilometrazaStart { get; set; }
public int? KilometrazaKraj { get; set; }
public virtual Klijent Klijent { get; set; }
public int? Page { get; set; }
}
Pagedclass
public class Pagedclass
{
public PagedList.IPagedList<NaloziViewModel> mylist { get; set; }
public int KilometrazaSum { get; set; }
public int VremeSum { get; set; }
}
Controller:
public ActionResult Index(int? page, DateTime? dateFrom, DateTime? dateTo, string klijentIme)
{
int pageSize = 10;
int pageNumber = (page ?? 1);
var naloziFilter = db.Nalozis.Include(n => n.Klijent).OrderByDescending(n => n.IDNalozi).Where(n => n.Obrisan == 0).ToPagedList(pageNumber,pageSize);
if (dateFrom != null && dateTo != null )
{
naloziFilter = naloziFilter.Where(n => n.Klijent.NazivKlijenta.Contains(klijentIme)).Where(n => n.VremeStart >= dateFrom).Where(n => n.VremeKraj <= dateTo).ToPagedList(pageNumber,pageSize);
TimeSpan vremeSum = new TimeSpan();
naloziFilter.Where(x => x.VremeKraj.HasValue).ToList().ForEach(x => vremeSum += x.VremeKraj.Value - x.VremeStart);
var model = new Pagedclass
{
mylist = naloziFilter,
KilometrazaSum = naloziFilter.Sum(n => n.KilometrazaKraj ?? 0) - naloziFilter.Sum(n => n.KilometrazaStart),
VremeSum = (vremeSum.Days*24)+vremeSum.Hours,
};
return View(model);
}
else
{
TimeSpan vremeSum = new TimeSpan();
naloziFilter.OrderByDescending(n => n.IDNalozi).Where(n => n.Obrisan == 0).Where(x => x.VremeKraj.HasValue).ToList().ForEach(x => vremeSum += x.VremeKraj.Value - x.VremeStart);
var model = new Pagedclass
{
mylist = naloziFilter,
KilometrazaSum = naloziFilter.Sum(n => n.KilometrazaKraj ?? 0) - naloziFilter.Sum(n => n.KilometrazaStart),
VremeSum = (vremeSum.Days * 24) + vremeSum.Hours
};
return View(model);
}
}
My view:
@model Pagedclass
@using PagedList;
@using PagedList.Mvc;
....
+3
source to share
1 answer
The basic version without using automapper is to modify Linq to return the desired object type (by adding it to the select clause):
eg. change this:
naloziFilter.OrderByDescending(n => n.IDNalozi)
.Where(n => n.Obrisan == 0)
.Where(x => x.VremeKraj.HasValue).ToList().ForEach(x => vremeSum += x.VremeKraj.Value - x.VremeStart);
for something like this:
naloziFilter.OrderByDescending(n => n.IDNalozi)
.Where(n => n.Obrisan == 0)
.Where(x => x.VremeKraj.HasValue)
.Select(x=> new NaloziViewModel(){
IDNalozi = x.IDNalozi,
KlijentID = x.KlijentID,
VremeStart = x.VremeStart,
VremeKraj = x.VremeKraj,
KilometrazaStart = x.KilometrazaStart,
KilometrazaKraj = x.KilometrazaKraj,
Klijent = x.Klijent,
Page = x.Page
})
.ToList().ForEach(x => vremeSum += x.VremeKraj.Value - x.VremeStart);
0
source to share