我是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控件。
答案 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 }) )