От представления к действию переданный идентификатор равен 0, используя PaginatedList <Book> - PullRequest
0 голосов
/ 15 февраля 2019

Это мой контроллер:

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" его можно передать, а "результат", который я передаю в View, - это PaginatedList

В моем представлении я использую @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", который является идентификатором элемента, который является книгой, поэтомучто я могу передать 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?Это мой класс "PaginatedList"

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 для Action, тогда связывание моделей работает, конечновсе равно нулю, кроме Id.

...