【问题标题】:Problem paging with multiple criteria in get request .NET MVC Core在获取请求.NET MVC Core 中使用多个条件进行分页问题
【发布时间】:2021-06-06 06:38:42
【问题描述】:

我正在使用 Net Core MVC 结构开发一个 Web 应用程序。我有一个包含许多搜索条件的页面,我想通过 URL 发送参数并获取请求。我在视图中使用了许多选择组件,并且可以选择多个值。我在请求中通过 URL 发送一个或多个值。在我看来,有一个分页系统,并且在使用过滤器值发出获取请求后没有检索或设置值来选择组件。我也在使用 Select2 组件。简而言之,分页会在视图控制器之间产生检索或发送值的问题。

[HttpGet]  
    public async Task<IActionResult> TumApartmanlar(long il,long[] ilceler, int? pageNumber)
    {
        ViewData["ilceler"] = ilceler;
        ViewData["il"] = il;
        //Then set to filters

        var sonuc = _apartmanService.ListByFilters(filters, loadImages: true);

        int pageSize = 10;
        TumApartmanlarViewModel tumApartmanlar = new TumApartmanlarViewModel();
        tumApartmanlar.ApartmanListe = PaginatedList<ApartmanListDto>.Create(sonuc, pageNumber ?? 1, pageSize),
       ..... another code part and paging


        return View(tumApartmanlar);
    }

查看部分:

 <form asp-controller="EndUser" asp-action="TumApartmanlar" method="get">
                <div class="row mt-2">
                    <div class="col-12">
                        <label>İl</label>
                        <select  class="form-control" id="selectIlSec"  asp-for="@ViewData["il"]" name="il"
                                asp-items="@(new SelectList(Model.Iller,"Id","Ad"))">
                            <option></option>
                        </select>
                    </div>

                </div>
                <div class="row mt-2">
                    <div class="col-12">
                        <label>İlçe</label>
                        <select multiple="multiple" class="form-control" disabled="@(Model.ApartmanFilters.IlId>0?false:"disabled")" id="selectIlceSec" 
                                 name="ilceler"  asp-for="@ViewData["ilceler"]" asp-items="@(new MultiSelectList(Model.Ilceler,"Id","Ad"))">
                            <option></option>
                        </select>
                    </div>
                 /*Another components*/
                </div>
               <button type="submit" style="width:100%;" class="btnAra btn btn-md p-2 mt-3 mb-3 btn-danger"> Ara </button>
                

</form>
    @{
        var prevDisabled = !Model.ApartmanListe.HasPreviousPage ? "disabled" : "";
        var nextDisabled = !Model.ApartmanListe.HasNextPage ? "disabled" : "";
    }

   

    <a asp-action="TumApartmanlar"
       asp-route-pageNumber="@(Model.ApartmanListe.PageIndex - 1)"                      
       asp-route-il="@Model.ApartmanFilters.IlId"
       asp-route-ilceler="@(ViewData["ilceler"].ToString())"
       class="btn btn-default @prevDisabled">
        Previous
    </a>


    <a asp-action="TumApartmanlar"           
       asp-route-pageNumber="@(Model.ApartmanListe.PageIndex + 1)"
       asp-route-il="@Model.ApartmanFilters.IlId"
       asp-route-ilceler="@(ViewData["ilceler"].ToString())"
       class="btn btn-default @nextDisabled">
        Next
    </a>

脚本部分

$("#selectIlSec").select2({
    width: 'resolve',
    placeholder: "İl Seçiniz",
    allowClear: true
});

$("#selectIlceSec").select2({
    width: 'resolve',
    placeholder: "İlçe Seçiniz",
    allowClear: true
});

如何实现点击分页按钮时发送多个选中的值?我尝试asp-for-ilceler 但不发送值。此外,当单击按钮获取请求时,URL 看起来像 ..../EndUser/TumApartmanlar?il=1&amp;ilceler=1&amp;ilceler=2... 分页不能像单独的 ilceler 那样绑定。我正在等待您的帮助,谢谢。

更新

我的过滤器类

 public class ApartmanListFilter
 {
    [FromQuery(Name = "il")]
    public long IlId { get; set; }    

    [FromQuery(Name = "ilceler")]
    public List<long> IlceIds { get; set; }
 }

如果我像上面那样使用,我的控制器和视图会像下面一样改变,但我仍然有问题。

 [HttpGet]
    public IActionResult Evler([FromQuery]ApartmanListFilter filters)
    {
        var sonuc = _apartmanService.ListByFilters(filters, loadImages: true);
       //Another codes
        return View(sonuc);
    }

<div class="col-12">
    <label>İl</label>
      <select  class="form-control" id="selectIlSec"  asp-for="@Model.ApartmanFilters.IlId" name="il"
    asp-items="@(new SelectList(Model.Iller,"Id","Ad"))">
       <option></option>
        </select>
 </div>

【问题讨论】:

  • 对我来说,?il=1&amp;ilceler=1&amp;ilceler=2可以成功绑定到动作public void test(long il,long[] ilceler),能详细描述一下你的问题吗?
  • 当我点击请求按钮时,不是绑定问题。但是单击分页链接会产生有关搜索条件的问题。单击可选择多个 select2 值的分页后,我丢失了搜索条件值。获取设置输入或 öne 值没有问题。唯一的问题是获取请求链接中的多选值。
  • 你能分享你的模型吗?
  • 我尝试了两种搜索条件。一种方法就像上面那样是单独的参数。第二种方法是创建用于获取过滤器值的模型。我正在与编辑帖子共享我的过滤器类和视图模型。实际上,正如我之前所说,问题在于单击分页链接,它会丢失搜索条件。

标签: c# asp.net-core model-view-controller asp.net-core-mvc model-binding


【解决方案1】:

解决方案 1

你可以使用javasript跳转,下面是一个例子。

Previous为例:

<a class="sort"  href="javascript:void(0)">
Previous
</a>

@section scripts{
    <script>
        var c=@Html.Raw(Json.Serialize((long[])ViewData["ilceler"]));
        $(".sort").click(function () {
            var link = "/EndUser/TumApartmanlar?";
            link += "il=" + 1 +"&";
            c.forEach(function (value) {
                link += "ilceler=" + value + "&";
            });
            link += "pageNumber=" + 1;
            window.location.href = link;
        })
    </script>
}

请注意ilpageNumber是我的模拟数据,需要你自己在javascript中获取。

测试结果:

解决方案 2

您可以将您的类型long[] 更改为string[],然后在您的TumApartmanlar 中:

 [HttpGet]
    public async Task<IActionResult> TumApartmanlar(long il, string[] ilceler, int? pageNumber)
    {
        string ids = String.Join(",", ilceler.Select(p => p.ToString()).ToArray());
        ViewData["ilceler"] = ids;
        ViewData["il"] = il;

然后当你点击a标签时,你的ilceler会变成string[0]="1,3", 然后您可以将数据处理成您想要的格式。

测试结果:

【讨论】:

  • 非常感谢您,感谢您的帮助。我像上面一样更改了我的代码,它可以工作,你的帮助节省了我的时间:) @Yinqiu
猜你喜欢
  • 2019-02-25
  • 2015-12-11
  • 2022-10-13
  • 2020-12-20
  • 1970-01-01
  • 2020-08-14
  • 2023-04-03
  • 2020-08-04
  • 1970-01-01
相关资源
最近更新 更多