2017-08-24 196 views
2

我试图使用DbContext在页面中显示我的数据。ASP.NET CORE将ID传递给控制器​​以显示页面

这是我的控制器:

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同样的列表是beeing显示。我究竟做错了什么 ?

B)它会工作后,我该如何呈现页面供用户选择? (E.G. 1,2,3..90)

谢谢。

+0

看起来像你正在使用'asp.net core'。相应地标记 – Rahul

+0

@Rahul Yup,固定。 – sagi

回答

2

Michal回答了你第一个问题。关于你的第二个问题,你可以使用第三方的标签佣工像pioneer-pagination

或写你自己的实现分页逻辑的观点像下面(主要是基于official documentation),不是完美的一个实现分页,但仍在工作:

模型页:

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); 
} 

代码标签帮手:

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; } 
} 

更新: 如果你想显示在你看来,你可以只是标签助手for循环像下面Process方法都PageLinks:

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`),请参阅A minimal Tag Helper section in documentation以获取更多信息。
+0

非常感谢。这似乎正是我需要的。 – sagi

+0

@sagi没问题。乐意效劳。 – user2771704

+0

嘿,我不明白在哪里实现使用视图' sagi

4

您的参数被命名为page,但您提供了id路由值。将操作方法​​中的page参数重命名为id,它应该起作用。

+0

谢谢,它工作。另一方面,如何在底部添加动态页面选择(根据数据量生成?) – sagi