Переплет моделей с нумерацией страниц - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть класс PagingInfo, который я использую для передачи информации в мой контроллер для функций нумерации страниц:

        public int TotalItems { get; set; }
        public int ItemsPerPage { get; set; }
        public int CurrentPage { get; set; }

        public int TotalPages => (int)Math.Ceiling((decimal)TotalItems / ItemsPerPage);

Кнопки нумерации страниц отображаются в моем виде с помощью:

<div page-model="Model.PagingInfo" page-action="SearchResult" page-classes-enabled="true" page-class="btn" page-class-selected="btn-primary" class="btn-group pull-right m-1"></div>

, поскольку он включает в себя пользовательский помощник по тегам:

[HtmlTargetElement("div", Attributes = "page-model")]
    public class PageLinkTagHelper : TagHelper
    {
        private IUrlHelperFactory urlHelperFactory;

        public PageLinkTagHelper(IUrlHelperFactory helperFactory)
        {
            urlHelperFactory = helperFactory;
        }

        [ViewContext]
        [HtmlAttributeNotBound]
        public ViewContext ViewContext { get; set; }

        public PagingInfo PageModel { get; set; }

        public string PageAction { get; set; }

        public bool PageClassesEnabled { get; set; } = false;
        public string PageClass { get; set; }
        public string PageClassNormal { get; set; }
        public string PageClassSelected { get; set; }

        public override void Process(TagHelperContext context,
                TagHelperOutput output)
        {
            IUrlHelper urlHelper = urlHelperFactory.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 { listPage = i });
                if (PageClassesEnabled)
                {
                    tag.AddCssClass(PageClass);
                    tag.AddCssClass(i == PageModel.CurrentPage
                        ? PageClassSelected : PageClassNormal);
                }
                tag.InnerHtml.Append(i.ToString());
                result.InnerHtml.AppendHtml(tag);
            }
            output.Content.AppendHtml(result.InnerHtml);
        }
    }

Также в моем представлении я связываю определенные элементы модели, необходимые для фильтрации элементов, отображаемых для разбивки на страницы, например

<input hidden asp-for="@Model.SearchTerms.FormID" class="form-control" />

Все это заключено в теги <form>. Однако, когда я нажимаю кнопки разбиения на страницы, привязка модели не происходит.

Я могу получить привязку к модели, если вместо этого поменяю теги <div> на теги <button>, как показано ниже:

<button page-model="Model.PagingInfo" page-action="SearchResult" page-classes-enabled="true" page-class="btn" page-class-selected="btn-primary" class="btn-group pull-right m-1"></button>

Однако это приводит к неправильному отображению кнопки разбивки на страницы, что делает его непригодным для использования (то же самое относится и к тегам <a>). Есть ли способ связать мою модель в элементе <div>?

...