C# 每次回发都会调用ASP.NET MVC索引操作

C# 每次回发都会调用ASP.NET MVC索引操作,c#,jquery,asp.net-mvc,postback,C#,Jquery,Asp.net Mvc,Postback,我是MVC(和web开发)的新手。目前,我的应用程序正在使用MVC5 我有一个web应用程序,UI如下图所示。基本上,它是一个单页应用程序,我需要根据顶部单选按钮的用户选择在底部加载网格。若单击“最新”,则最新的用户数据将绑定到网格。同样,如果选择“历史”,则历史数据将绑定到同一网格 我在HomeController.cs中的操作如下所示 public ActionResult Index() { var viewModel = new ViewModel(); List use

我是MVC(和web开发)的新手。目前,我的应用程序正在使用MVC5

我有一个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()
@Html.Grid(Model).Columns(Columns=>
{
/*使用内联html帮助器添加渲染主体的未映射列*/
columns.Add()
.编码(假)
.消毒(假)
.SetWidth(30)
.RenderValueAs(d=>
@
@ActionLink(“编辑”、“索引”)
);
/*添加“OrderID”列:*/
columns.Add(o=>o.OrderID)
.标题为(“编号”)
.设置宽度(100);
/*增加“Vip客户”栏:*/
columns.Add(o=>o.Customer.IsVip)
.标题为“Vip客户”)
.SetWidth(150)
.RenderValueAs(o=>CustomRenderingOfColumn(o));
}).SetRowCssClasses(item=>item.Customer.IsVip?“警告”:string.Empty).WithPaging(15).Sortable().Filterable().WithMultipleFilters()
现在我面临的问题是,如果用户因为一个
过滤器
操作而查看历史数据,我将历史数据加载到网格中。如果用户现在通过使用网格中的分页控件导航到下一页,则会触发回发,从而执行索引操作并始终加载最新数据。理想情况下,我应该呆在同一页上,并在第2页中显示下一个历史数据

请帮助我如何处理这种情况

仅供参考:我使用的是数据网格,Bottstrap用于UI控件


MVC中没有
postback
。ASP.NET MVC不同于
webforms
。如果您需要在单击分页链接时显示一组不同的数据(第2页、第3页等等),那么您需要编写自定义代码来实现这一点。否则你可以考虑<代码> PagedList <代码> .< 要安装PagedList.Mvc,请在
软件包管理器控制台中运行以下命令。您也可以使用NuGet获取此包

PM> Install-Package PagedList.Mvc
在控制器中,参考
页面列表
,控制器的索引方法如下

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)

@model PagedList.IPagedList
@使用PagedList.Mvc;
@foreach(模型中的var项目){
@DisplayFor(modelItem=>item.UserId)
@DisplayFor(modelItem=>item.UserName)
}

@Model.PageCount的@页(Model.PageCountUrl.Action(“Index”,new{page}))
“绑定到网格”需要进一步扩展才能使这个问题有意义。@spender我已经添加了如何将其绑定到视图和网格的示例。我还在问题底部的注释中为Grid.MVC演示添加了超链接。希望有帮助。我在代码中已经介绍了这一部分,不会解决我的问题。顺便说一句,Grid.Mvc控件已经处理了相同的分页策略。假设,我已经通过索引操作加载了最新的用户。现在,用户希望看到历史数据并应用过滤器-所以它转到过滤器操作,我清除网格并将历史数据加载到同一网格。现在用户在网格中单击第2页。此事件不会执行HTTP-POST过滤操作,而是通过索引(HTTP Get)操作执行。因此,它将再次加载最新数据(理想情况下,我应该显示历史数据的第2页)。
@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 }) )