【问题标题】:Model Binding with Pagination TagHelper使用 Pagination TagHelper 绑定模型
【发布时间】:2018-04-05 14:21:09
【问题描述】:

我有以下PageLinkTagHelper.cs 为项目列表生成分页链接

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

我正在努力修改它以使用模型绑定。我想在以下方法中使用它:

public IActionResult SearchResult(SearchResultViewModel viewModel, int listPage =1)
        {
            if (viewModel != null)
            {
                List<Form> searchResult = GetSearchResult(viewModel.SearchTerms).ToList();
                var model = new SearchResultViewModel
                {
                    Forms = searchResult
                        .OrderBy(f => f.FormID)
                        .Skip((listPage - 1) * PageSize)
                        .Take(PageSize),
                    SearchTerms = new SearchTerms
                    {
                        //search criteria deleted for brevity
                    },
                    PagingInfo = new PagingInfo
                    {
                        CurrentPage = listPage,
                        ItemsPerPage = PageSize,
                        TotalItems = searchResult.Count()
                    }
                };

                return View("SearchResult", model);
            }
            return View("SearchForms");
        }

生成的链接是localhostXXXX/Form/SearchResult?listPage=#,其中生成了正确的列表页面。但是,单击链接时传递给控制器​​的SearchResultViewModel 为空。这具有返回存储库中所有项目的效果(因为没有要过滤的搜索词)。如何将我的SearchResultViewModel.cs 对象与此分页绑定?

我的观点是

@model SearchResultViewModel
@foreach (var form in Model.Forms)
{
    @Html.Partial("FormSummary", form)
}

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

【问题讨论】:

  • 你不必使用 @ 作为标签助手 page-model="Model.PagingInfo" 应该可以工作

标签: c# asp.net-core pagination


【解决方案1】:

如果您不希望SearchResultViewModel 为空,则需要传递localhostXXXX/Form/SearchResult?PagingInfo.CurrentPage=# 之类的内容。在这种情况下,您将设置SearchResultViewModel 的属性。

【讨论】:

  • 我尝试使用 nameasp-for TagHelpers 设置带有隐藏输入框的模型属性,但模型仍然为空
  • 希望您将其添加到表单中并提交表单"
  • 问题可能出在标签助手中。如果它是&lt;button&gt; 而不是&lt;div&gt;,它可以正常工作。问题是,我无法正确设置按钮样式
猜你喜欢
  • 2015-07-27
  • 2016-08-19
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 2010-09-22
相关资源
最近更新 更多