c# - 从视图到操作,使用 PaginatedList 传递的 ID 为 0
问题描述
这是我的控制器:
public async Task<IActionResult> Index(string sortOrder, string currentFilter, string searchString, int? page)
{
var user = await _userManager.GetUserAsync(HttpContext.User);
ViewData["CurrentSort"] = sortOrder;
ViewData["GenreSortParm"] = string.IsNullOrEmpty(sortOrder) ? "genre_desc" : "";
ViewData["DateSortParm"] = sortOrder == "Date" ? "date_desc" : "Date";
ViewData["CurrentFilter"] = searchString;
var userBooks = _userService.PagedUserBooks(user, sortOrder, currentFilter, searchString, page);
var result = await PaginatedList<Book>.CreateAsync(userBooks, page ?? 1, 5);
return View(result);
}
“userBooks”是一个 IQueryable,因此可以在“CreateAsync”中传递它,而我传递给视图的“结果”是 PaginatedList
在我的视图中,我使用的是 a @model PaginatedList<Book>
,而我的视图的这一部分出现了问题
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@item.Genre
</td>
<td>
@item.Title
</td>
<td>
@item.CreatedOn
</td>
<td>
<a asp-controller="Book" asp-action="MakeReview" asp-route-id="@item.Id" class="btn btn-success">Add Review</a>
</td>
</tr>
}
</tbody>
我使用asp-route-id="@item.Id"
which 是项目的 Id,即 Book,这样我就可以将 Id 传递给操作“MakeReview”,正如您在“<a asp-controller="Book" asp-action="MakeReview" asp-route-id="@item.Id" class="btn btn-success">Add Review</a>
但是当我转到我的操作方法”中指定的那样
[HttpGet]
public async Task<IActionResult> MakeReview(int bookId)
{
var user = await _userManager.GetUserAsync(HttpContext.User);
var book = await _bookService.GetById(user, bookId);
//Not fully implemented
return View();
}
作为参数传递的 int bookId 应该是我选择查看的书的 Id,但它始终为 0。这是否与使用 PaginatedList 作为模型有关,而在类内部我没有属性ID?这是我的课“分页列表”
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);
}
}
更新:当动作 MakeReview 中的参数是 Book 类型而不是 int 并且我将 int 的 ID 传递给 Action 时,模型绑定工作,当然除了 Id 之外的一切都是空的。
解决方案
推荐阅读
- c++ - 用符号版本替换对函数的所有调用
- c# - 在 C# 中添加日期到日期问题中的问题
- firebase - Flutter - 提交表单时如何将DropDownMenu的选定索引保存到FireStore
- c# - 为什么 Visual Studio 2013 中没有安装实体框架包?
- gmail-api - 服务“gmail.googleapis.com”的配额指标“查询”和限制“每个用户每分钟的查询数”超出配额
- ios - iOS 权限描述限制
- powershell - 将 PSCustomObject 添加到数组会产生错误,但在 Powershell 中调试代码时工作正常
- reactjs - 当我通过真实性测试时,ReactJS 给了我无法访问的代码
- c++ - 关于:C++ 中异常对象的范围:为什么我没有得到副本?
- python - eq函数python的对面/选择列中具有两个以上相同条目的行