【问题标题】:How to use pagedlistpager when passing a viewmodel to my action将视图模型传递给我的操作时如何使用 pagedlistpager
【发布时间】:2015-07-22 06:37:28
【问题描述】:

我的第二个参数“@Html.PagedListPager”应该使用什么? 如果我的控制器中有一个动作可以接受这样的视图模型

    [HttpPost]
    [AllowAnonymous]
    public ActionResult Search(HomePageViewModel viewModel) 
    {
        var pagedList = repository.GetYogaList(viewModel.SearchQuery, viewmodel.Date)
        viewModel.YogaList = pagedList;
        if (Request.IsAjaxRequest())
        {
            return PartialView("_mySpaces", viewModel);
        }

        return View(viewModel);
     }

以及包含分页列表 html 助手的部分页面

这里是部分'_mySpaces.html'

@model HomePageViewModel
<div id="yogaSpaceList">

  <div class="pagedList">
    @Html.PagedListPager(Model.YogaSpaces, page => Url.Action("Search", new { Model }), PagedListRenderOptions.MinimalWithItemCountText)
  </div>

  @foreach (var space in Model.YogaSpaces) {
  <div>
    <h4>@space.Overview.Title</h4>
    <div>
      @space.Overview.Summary
    </div>
  </div>
  }
</div>

【问题讨论】:

  • 你没有传递你的模型,你传递了一个值 (int) 来指示要显示的页面。它应该是 GET,而不是 POST 方法。查看PagedList site上的示例
  • 如果搜索是我的主要操作,用于首先从我的主页运行我的搜索查询并且我正在传递一个视图模型,我应该为分页创建一个新操作吗?我有点困惑的是,我必须将一些视图模型数据传递给操作,例如搜索查询、日期等。所以除了页面之外,我还需要视图模型数据。
  • @Html.PagedListPager( Model.YogaSpaces, page =&gt; Url.Action("Search", new { page = page, searchText = someValue, date = anotherValue, etc }) ) 之类的东西,然后将这些参数添加到您的 GET 方法中
  • 所以我不能使用在视图模型中传递的操作“搜索”?
  • 这样做没有意义。您的方法应该是 GET,而不是 POST,并且您不能将包含集合属性的复杂对象传递给 GET 方法(绑定将失败)。无论如何你需要传递的是页码。

标签: html asp.net-mvc pagedlist


【解决方案1】:

好的,您可以将视图模型传递回操作,但如前所述,它需要是 GET 方法,因此请使用 HttpGet 属性标记您的操作。 MVC 框架会将查询字符串翻译/绑定到您的视图模型。

您的控制器应如下所示:

[HttpGet]
public ActionResult Search(ViewModel viewModel) 
{
    \\ do something useful here and return ActionResult .....
}

您需要向您的 ViewModel 添加一个页面属性,并且有一个方法允许您的 .cshtml 代码设置页码并将视图模型作为对象返回。 MVC 会将对象转换为操作链接的查询字符串。

Public class ViewModel {

    // other properties and stuff

    public int? Page { get; set; }
    public object ToPagedListParameters(int page)
    {
         this.Page = page;
         return this;
    }
}

那么只需对您的 .cshtml 文件稍作调整即可

<div class="pagedList">
      @Html.PagedListPager(viewModel, page => Url.Action("Search",viewModel.ToPagedListParameters(page))
</div>

注意:我只在简单的 viewModel 上使用过这个功能,并没有在包含集合或列表的 viewModel 上尝试过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2013-06-04
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    相关资源
    最近更新 更多