【发布时间】:2019-09-20 23:41:17
【问题描述】:
我正在尝试通过必须由自定义 TagHelper 建立的特殊标签将列出的项目划分为页面
我有一个类来保存将要处理的页面和项目的数据
namespace SportWeb.Models.ViewModels
{
public class PagingInfo
{
public int TotalItems { get; set; }
public int ItemsPerPage { get; set; }
public int CurrentPage { get; set; }
public int TotalPages { get { return (int)Math.Ceiling((decimal)TotalItems / ItemsPerPage); } }
}
}
我将它包装在另一个模型视图数据中
namespace SportWeb.Models.ViewModels
{
public class ProductListViewModel
{
public IEnumerable<Product> Products { get; set; }
public PagingInfo PagingInfos { get; set; }
}
}
然后将其插入到Controller Class中以检索数据并建立逻辑
public class ProductController : Controller
{
private IProductRepository _iProductRepository;
int PageSize = 4;
public ProductController(IProductRepository iProductRepository)
{
_iProductRepository = iProductRepository;
}
public IActionResult List(int itemPage = 1) => View(new ProductListViewModel
{ Products = _iProductRepository
.List.OrderBy(p => p.ProductID)
.Skip((itemPage - 1) * PageSize)
.Take(PageSize),
PagingInfos = new PagingInfo {
CurrentPage = itemPage,
ItemsPerPage = PageSize,
TotalItems= _iProductRepository.List.Count()} });
}
}
并创建我的 TagHelper 类
namespace SportWeb.InfraSturcture
{
[HtmlTargetElement("div", Attributes = "page-model")]
public class PageLinkTagHelper :TagHelper
{
private IUrlHelperFactory _iUrlHelperFactory;
public PageLinkTagHelper(IUrlHelperFactory iUrlHelperFactory)
{
_iUrlHelperFactory = iUrlHelperFactory;
}
[ViewContext]
[HtmlAttributeNotBound]
public ViewContext ViewContext { get; set; }
public PagingInfo PageModel { get; set; }
public string PageAction { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
IUrlHelper urlHelper = _iUrlHelperFactory.GetUrlHelper(ViewContext);
TagBuilder result = new TagBuilder("div");
for (int i=1; i<PageModel.TotalPages; i++)
{
TagBuilder tag = new TagBuilder("a");
tag.Attributes["href"] = urlHelper.Action(PageAction, new { itempPage = i });
tag.InnerHtml.Append(i.ToString());
result.InnerHtml.AppendHtml(tag);
}
output.Content.AppendHtml(result.InnerHtml);
}
}
}
这里是查看页面代码
ViewData["Title"] = "List";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@model ProductListViewModel
@addTagHelper SportWeb.InfraStructure.*,SportStore
<h1>List</h1>
@foreach (var p in Model.Products)
{
<div>
<h3>@p.Name</h3>
@p.Description
<h4>@p.Price.ToString("c")</h4>
</div>
}
<div page-model="@Model.PagingInfos" page-action="List"></div>
查看下面的导入代码
@using SportWeb.Models
@using SportWeb.Models.ViewModels
@using SportWeb.Entity
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper SportWeb.InfraStructure.*, SportWeb
但是当程序运行时,导航面板没有出现在页面上 Here navigation panel is not appearing
当我打开页面源代码时,标签助手似乎不起作用,代码不会添加创建的标签。
我不明白为什么我的标签助手根本不起作用。你知道我在哪里犯错了吗?
编辑:我正在使用 CORE 3.0 功能。会不会是这个问题造成的?
【问题讨论】:
-
我尝试重现您的场景,它对我有用,但我使用的是 .NET Core 2.2。您使用的是 Visual Studio 2019 吗?
标签: asp.net-mvc attributes tag-helpers .net-core-3.0