每次回发都会调用ASP.NET MVC Index操作

时间:2014-10-07 16:56:32

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

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

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

我在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控件。

enter image description here

1 个答案:

答案 0 :(得分:0)

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