【问题标题】:ASP.NET MVC Index action gets called every postback每次回发都会调用 ASP.NET MVC 索引操作
【发布时间】:2014-10-07 16:56:31
【问题描述】:

我是 MVC(和 Web 开发)的新手。目前,在我的应用程序中使用 MVC 5。

我有一个 Web 应用程序,用户界面如下图所示。基本上,它是一个单页应用程序,我需要根据顶部单选按钮的用户选择来加载底部的网格。如果单击最新,则最新的用户数据将绑定到网格。同样,如果选择历史数据,则历史数据将绑定到同一个网格。

我在 HomeController.cs 中的操作如下所示。

public ActionResult Index()
{
    var viewModel = new ViewModel();
    List users = GetLatestUsers();
    viewModel.Users = users;
    return View(viewModel);
}

[HttpPost]
public ActionResult Filter(ViewModel postData)
{
    List users = GetHistoricUsers();
    viewModel.Users = users;
    return View(viewModel);
}

按照评论中的要求进行更详细的说明,在我看来,我绑定到网格是这样的

@Html.Grid(Model).Columns(columns =>
{
/* Adding not mapped column, that renders body, using inline Razor html helper */
columns.Add()
        .Encoded(false)
        .Sanitized(false)
        .SetWidth(30)
        .RenderValueAs(d =>
            @<b>
                @Html.ActionLink("Edit", "Index")
            </b>);


     /* Adding "OrderID" column: */
    columns.Add(o => o.OrderID)
            .Titled("Number")
            .SetWidth(100);

   /* Adding "Vip customer" column: */
    columns.Add(o => o.Customer.IsVip)
            .Titled("Vip customer")
            .SetWidth(150)
            .RenderValueAs(o => CustomRenderingOfColumn(o));

}).SetRowCssClasses(item => item.Customer.IsVip ? "warning" : string.Empty).WithPaging(15).Sortable().Filterable().WithMultipleFilters()

现在我面临的问题是,如果用户因为Filter 操作而查看历史数据,我会将历史数据加载到网格中。如果用户现在通过使用网格中的分页控件导航到下一页,它会触发回发,因此会执行索引操作并始终加载最新数据。理想情况下,我应该留在同一页面并在第 2 页显示下一个历史数据。

请帮助我处理这种情况。

仅供参考:我将 Grid.Mvc 用于数据网格,将 Bottstrap 用于 UI 控件。

【问题讨论】:

  • “绑定到网格”需要扩展才能使这个问题有意义。
  • @spender 我添加了有关如何将其绑定到视图和网格的示例。我还在问题底部的注释中添加了指向 Grid.MVC 演示的超链接。希望对您有所帮助。

标签: c# jquery asp.net-mvc postback


【解决方案1】:

MVC 中没有postback。 ASP.NET MVC 与webforms 不同。如果您需要在单击分页链接时显示一组不同的数据(第 2 页、第 3 页等),那么您需要编写自定义代码来执行此操作。否则可以考虑PagedList

要安装 PagedList.Mvc,请在 Package Manager Console 中运行以下命令。你也可以使用 NuGet 来获取这个包。

PM> Install-Package PagedList.Mvc

在您的控制器中,引用 PagedList 并且您的控制器的 Index 方法将类似于

using PagedList;

public ActionResult Index(int? page)
{
      var viewModel = new ViewModel();
      List users = GetLatestUsers();
      viewModel.Users = users;

      int pageSize = 3;
      int pageNumber = (page ?? 1);
      return View(viewModel.Users.ToPagedList(pageNumber, pageSize));
}

还有您的索引视图(使用适当的命名空间更改对 User 模型的引用)

@model PagedList.IPagedList<Users>
@using PagedList.Mvc; 
<link href="/Content/PagedList.css" rel="stylesheet" type="text/css" />

<table>
@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.UserId)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.UserName)
        </td>
    </tr>
}
</table>

<br />

Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
@Html.PagedListPager( Model, page => Url.Action("Index", new { page }) )

【讨论】:

  • 我已经在我的代码中介绍了这部分,但不能解决我的问题。顺便说一句,Grid.Mvc 控件已经处理了相同的分页策略。假设,我已经通过我的索引操作加载了最新的用户。现在用户想要查看历史数据并应用过滤器 - 所以它进入过滤器操作,我清除网格并将历史数据加载到同一个网格。现在用户单击网格中的第 2 页。此事件不会对过滤器操作执行 HTTP-POST,而是通过索引(http 获取)操作进行。因此,它将再次加载最新数据(理想情况下,我应该显示历史数据的第 2 页)。
猜你喜欢
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 2017-02-15
  • 2017-11-02
  • 2023-03-28
相关资源
最近更新 更多