C# 每次回发都会调用ASP.NET MVC索引操作
我是MVC(和web开发)的新手。目前,我的应用程序正在使用MVC5 我有一个web应用程序,UI如下图所示。基本上,它是一个单页应用程序,我需要根据顶部单选按钮的用户选择在底部加载网格。若单击“最新”,则最新的用户数据将绑定到网格。同样,如果选择“历史”,则历史数据将绑定到同一网格 我在HomeController.cs中的操作如下所示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
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 }) )