首页 > 解决方案 > 从视图到操作,使用 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#asp.net-mvcasp.net-corepaginationmodel-binding

解决方案


推荐阅读