无法在 EF 核心"Cannot implicitly convert type, An explicit conversion exists (are you missing a cast?)"中添



我必须将分页列表添加到我的项目中。我正在学习本教程。我实际上可以在其他页面上添加分页,但我必须添加ViewModels来验证我的搜索框。如果我使用ViewModels,我就不能使用教程中的分页列表。错误显示

RuntimeBinderException:无法隐式转换类型"System.Collections.Generic.List<ContosoUniversity。模型。学生>'到'ContosoUniversity.PaginatedList<ContosoUniversity。模型。学生>'。存在显式转换(是否缺少强制转换?(

这是我的控制器

public async Task<IActionResult> IndexProsesAsync(string sortOrder, StudentVM model, StudentVM currentFilter, int? pageNumber)
{
ViewData["CurrentSort"] = sortOrder;
ViewData["NameSortParm"] = sortOrder == "name" ? "name_desc" : "name";
ViewData["DateSortParm"] = sortOrder == "Date" ? "date_desc" : "Date";
ViewData["FirstSortParm"] = String.IsNullOrEmpty(sortOrder) ? "first_desc" : "";
if (model != null)
{
pageNumber = 1;
}
else
{
model = currentFilter;
}
ViewData["CurrentFilter"] = model.FirstMidName;
ViewData["CurrentFilter2"] = model.LastName;
ViewData["CurrentFilter3"] = model.EnrollmentDateFrom;
ViewData["CurrentFilter3"] = model.EnrollmentDateUntil;
var students = from s in _context.Students 
select s;
// sorting // 
students = sortOrder switch
{
"name" => students.OrderBy(s => s.LastName),// asc last name
"name_desc" => students.OrderByDescending(s => s.LastName),//desc last name
"first_desc" => students.OrderByDescending(s => s.FirstMidName),// desc first name
"Date" => students.OrderBy(s => s.EnrollmentDate),// asc date
"date_desc" => students.OrderByDescending(s => s.EnrollmentDate),// desc date
_ => students.OrderBy(s => s.FirstMidName),// asc first name
};
// filtering
if (model.EnrollmentDateFrom != null && model.EnrollmentDateUntil != null)
{
students = students.Where(s => s.EnrollmentDate >= model.EnrollmentDateFrom && s.EnrollmentDate <= model.EnrollmentDateUntil);
}
if (!String.IsNullOrEmpty(model.LastName))
{
students = students.Where(s => s.LastName.Contains(model.LastName));
}
if (!String.IsNullOrEmpty(model.FirstMidName))
{
students = students.Where(s => s.FirstMidName.Contains(model.FirstMidName));
}
ViewBag.students = students.ToList();
int pageSize = 3;
return View(await PaginatedList<Student>.CreateAsync(students.AsNoTracking(), pageNumber ?? 1, pageSize));
}

我的分页列表类

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 => PageIndex > 1;
public bool HasNextPage => 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);
}
}

这是在视图index.cshtml文件的顶部

@model ContosoUniversity.Models.SchoolViewModels.StudentVM
@{
ViewData["Title"] = "Students";
PaginatedList<ContosoUniversity.Models.Student> students = ViewBag.students;
}

问题在剃须刀的供应模型中。

剃刀锉:

@model ContosoUniversity.Models.SchoolViewModels.StudentVM */ It's required StudentVM */

控制器:

return View(await PaginatedList<Student>.CreateAsync(students.AsNoTracking(), pageNumber ?? 1, pageSize));

您提供了分页的学生模型,这是导致错误的原因。

您将不得不更换类似剃须刀的@model PaginatedList<ContosoUniversity.Models.Student>,或者您只需要从Controller提供StudentVM,如下所示:

StudentVM model=new StudentVM();
return view(model);

以上更改肯定会解决您的问题。

你可以查看你的推荐文件参考链接

相关内容

最新更新