ASP.NET CORE传递ID到控制器以显示页面

3

我正在尝试使用 DbContext 将我的数据分页显示。

这是我的控制器:

  public async Task<IActionResult> Index(int? page)
    {
        int _page;
        if (page.HasValue)
        {
            _page = page.Value;
        }
        else
            _page = 1;
        return View(await _context.Agent.Skip(_page-1).Take(10).ToListAsync());

我有一个包含链接的布局页面:

 <li><a asp-area="" asp-controller="Agents" asp-action="Index" asp-route-id="1" >סוכן</a></li>

有两个问题:

A) 无论我传递什么到asp-route-id,似乎都不起作用,相同的列表都会显示。我做错了什么?

B) 当它开始工作后,我如何呈现页面供用户选择?(例如1、2、3..90)

谢谢。


看起来你正在使用 asp.net core。请相应地打标签。 - Rahul
@Rahul 好的,已修复。 - sagi
2个回答

6

您的参数名为page,但您提供了一个id路由值。将操作方法中的page参数重命名为id,它就可以工作了。


谢谢,它运行正常。关于另一个主题,我如何在底部添加动态页面选择(根据存在的数据量生成)? - sagi

2

Michal回答了你的第一个问题。关于你的第二个问题,你可以使用第三方标签助手,例如pioneer-pagination

或者像下面这样为视图编写自己的分页逻辑实现(主要基于官方文档),这不是完美的分页实现,但仍然有效:

分页模型:

public class PageViewModel
{
    public int PageNumber { get; }
    public int TotalPages { get; }

    public PageViewModel(int count, int pageNumber, int pageSize)
    {
        PageNumber = pageNumber;
        TotalPages = (int)Math.Ceiling(count / (double)pageSize);
    }

    public bool HasPreviousPage => (PageNumber > 1);

    public bool HasNextPage => (PageNumber < TotalPages);
}

tag helper的代码:

public class PagerTagHelper : TagHelper
{
    private IUrlHelperFactory urlHelperFactory;
    public PagerTagHelper(IUrlHelperFactory helperFactory)
    {
        urlHelperFactory = helperFactory;
    }
    [ViewContext]
    [HtmlAttributeNotBound]
    public ViewContext ViewContext { get; set; }
    public PageViewModel PageModel { get; set; }
    public string PageAction { get; set; }
    public string PageController { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        IUrlHelper urlHelper = urlHelperFactory.GetUrlHelper(ViewContext);
        output.TagName = "div";

        // we put our links in list
        TagBuilder tag = new TagBuilder("ul");
        tag.AddCssClass("pagination");

        //show link for 1st page
        if (PageModel.PageNumber>2)
        {
              TagBuilder fstItem = CreateTag(1, urlHelper);
              tag.InnerHtml.AppendHtml(fstItem);
        }


        // create 3 links to current, next and previous page.
        TagBuilder currentItem = CreateTag(PageModel.PageNumber, urlHelper);

        // link to previous page if NOT 1st page
        if (PageModel.HasPreviousPage)
        {
            TagBuilder prevItem = CreateTag(PageModel.PageNumber - 1, urlHelper);
            tag.InnerHtml.AppendHtml(prevItem);
        }

        tag.InnerHtml.AppendHtml(currentItem);
        // link to next page, if NOT last page
        if (PageModel.HasNextPage)
        {
            TagBuilder nextItem = CreateTag(PageModel.PageNumber + 1, urlHelper);
            tag.InnerHtml.AppendHtml(nextItem);
        }


        //show code for last page
        if (PageModel.TotalPages > 4 && PageModel.PageNumber!=PageModel.TotalPages-1 && PageModel.HasNextPage)
        {
            TagBuilder lstItem = CreateTag(PageModel.TotalPages, urlHelper);
            tag.InnerHtml.AppendHtml(lstItem);
        }

        output.Content.AppendHtml(tag);
    }

    TagBuilder CreateTag(int pageNumber, IUrlHelper urlHelper)
    {
        TagBuilder item = new TagBuilder("li");
        TagBuilder link = new TagBuilder("a");
        if (pageNumber == this.PageModel.PageNumber)
        {
            item.AddCssClass("active");
        }
        else
        {
            link.Attributes["href"] = urlHelper.Action(PageAction, PageController, new { page = pageNumber });
        }
        link.InnerHtml.Append(pageNumber.ToString());
        item.InnerHtml.AppendHtml(link);
        return item;
    }
}

在视图中使用它(不要忘记在_ViewImports.cshtml中导入标签助手):

<pager page-model="@Model.PageViewModel" page-action="Index" page-controller="Home"></pager>

控制器的代码如下:

public async Task<IActionResult> Index(int page=1)
{
    int pageSize = 10;
    var count = await _context.Agent.CountAsync();
    var items = await _context.Agent.Skip((page - 1) * pageSize).Take(pageSize).ToListAsync();

    PageViewModel pageVm= new PageViewModel(count, page, pageSize);
    IndexViewModel vm= new IndexViewModel
    {
        PageViewModel = pageVm,
        Agents =items // need to create table in view from Agent properties
    };
    return View(vm);
}

以下是IndexViewModel的代码:

public class IndexViewModel
{
    public IEnumerable<Agent> Agents { get; set; }
    public PageViewModel PageViewModel { get; set; }
}

更新: 如果你想在视图中显示所有的 PageLinks,你可以像下面这样在 Tag Helper 的 Process 方法中使用 for 循环:
 public override void Process(TagHelperContext context, TagHelperOutput output)
 {
     IUrlHelper urlHelper = urlHelperFactory.GetUrlHelper(ViewContext);
     output.TagName = "div";

     // we put our links in list
     TagBuilder tag = new TagBuilder("ul");
     tag.AddCssClass("pagination");

     for (int i = 1; i <= PageModel.TotalPages; i++)
     {
         TagBuilder linkItem = CreateTag(i, urlHelper);
         tag.InnerHtml.AppendHtml(linkItem);
     }

     output.Content.AppendHtml(tag);
 }

更新2:

为了使用这种方法,请不要忘记将您主页的模型更改为IndexViewModel并在_ViewImports.cshtml中注册标签助手。我的工作视图(简化版)如下所示。

@* Using and tag helper imported in _ViewImports.cshtml *@
@model IndexViewModel

@{
    ViewData["Title"] = "Home";
}

<div>
    <table class="table">
        <tr><th>Name</th><th>Age</th></tr>
        @foreach (var a in Model.Agents)
        {
            <tr><td>@a.Name</td><td>@a.Age</td></tr>
        }
    </table>

</div>

<pager page-model="@Model.PageViewModel" page-action="Index" page-controller="Home"></pager>

更新3::

  1. 如果您像我以上所写的使用 IndexViewModel,但不像我的示例那样使用foreach,您应该将 @Html.DisplayNameFor(model => model.Name) 更改为 @Html.DisplayNameFor(model => model.Agents.Name)
  2. @addTagHelper *,Microsoft.AspNetCore.Mvc.TagHelpers 仅导入内置的ASP.NET Core标签助手。要导入自定义标签,您应该使用 @addTagHelper *,YourAssemblyName,其中 YourAssemblyName 是您项目的名称(例如 'AgentApp'),请参见文档中的最小标签帮助器部分以获取更多信息。

非常感谢。看起来正是我所需要的。 - sagi
我试图将它放在“index”页面中,但是我收到了一个错误:“IENumerable <Agent>不包含PageViewModel的定义”。 - sagi
@sagi 请查看我的回答中的 Update2。我认为您忘记将视图的 @modelIENumerable<Agent> 更改为 IndexViewModel - user2771704
没关系,解决了那个愚蠢的问题,但我又遇到了另一个问题。我正在使用 @Html.DisplayNameFor(model => model.Name) 来显示标题,但不是模型。Name 是下划线。 - sagi
还有一件事,路由是有效的,但只有在我手动在路径上写入页面编号时才有效。我没有看到任何按钮或其他东西来进行上一页/下一页操作。再次感谢你。 (也许我没有正确地将TagHelper放在viewImports中?我使用了@addTagHelper *,Microsoft.AspNetCore.Mvc.TagHelpers - sagi
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接