我在ASP .NET MVC 4.0中使用webgrid进行分页,但是我遇到了一些麻烦。我希望在DropDownList中选择RowsPerPage属性webgrid。一切都很好但是当我转到第2页或第3页时...默认RowsPerPage = 5。我知道为什么,但我无法解决它。请帮助我解决问题。这是我的代码
的HomeController
Username1
Username2
.........
UsernameN
ListUsers :
Index.cshtml
public class HomeController : Controller
{
[HttpGet]
public ActionResult Index()
{
ViewBag.rowsPerPage = 5;
return View(new StudentModel().ListStudent());
}
[HttpPost]
public ActionResult Index(string model)
{
ViewBag.rowsPerPage = int.Parse(Request.Form["paging"].ToString());
return View(new StudentModel().ListStudent());
}
}
答案 0 :(得分:2)
因此,当您转到第2页或第3页时,WebGrid会向服务器发送GET请求。在GET动作处理程序上你有这个:
ViewBag.rowsPerPage = 5;
所以你一直在重置rowsPerPage
。
实际上,rowsPerPage
中处理这些更改的正确方法不应该是表单提交。当应该在服务器上更改数据时(例如写入DB),将使用POST请求。没有类似的事情发生在这里,所以正确的方法是:
让表单执行GET请求而不是POST
@using (Html.BeginForm("Index", "Home", FormMethod.Get){
...
使WebGrid成为同一表单的一部分。
摆脱POST动作处理程序,因为我们不再执行POST了,而且在GET处理程序中有类似的东西(这里没有经过测试的代码):
[HttpGet]
public ActionResult Index(string paging)
{
if (!String.IsNullOrEmpty(paging))
{
// alternatively use TryParse
ViewBag.rowsPerPage = int.Parse(paging);
}
else
{
// default value
ViewBag.rowsPerPage = 5;
}
更改DropDwonList标记以根据ViewBag值决定所选项目:
@Html.DropDownList(
"paging",
new SelectList(
new List<SelectListItem>{
new SelectListItem{Text="1",Value="1"},
new SelectListItem{Text="5",Value="5"},
new SelectListItem{Text="10",Value="10"}
}, "Value", "Text", ViewBag.rowsPerPage),
new { onchange = @"form.submit();"})
甚至更简单
@Html.DropDownList(
"paging",
new SelectList(
new List<int>{1, 5, 10}, ViewBag.rowsPerPage),
new { onchange = @"form.submit();"})
另外,作为旁注,你应该考虑扩大你的模型以包含其中的所有数据,例如页面大小,用户选择,页码的选择 - 否则你的代码将变得越来越难以维护。 / p>
答案 1 :(得分:0)
创建一个视图模型来表示您想要显示和编辑的内容,以便强烈绑定到您的属性
public class StudentVM
{
[Display(Name = "Items per page")]
public int Paging { get; set; }
public IEnumerable<SelectListItem> PageList { get; set; }
public List<M_STUDENT> Students { get; set; }
}
并在控制器中(您不更改数据,因此应删除post方法)
[HttpGet]
public ActionResult Index(int? paging)
{
var pageList = new int[]{ 1, 5, 10 };
StudentVM model = new StudentVM()
{
Paging = paging ?? 5,
PageList = new SelectList(pageList),
Students = // your query to return the students
};
return View(model );
}
并将您的观点更改为
@model yourAssembly.StudentVM
@using(@Html.BeginForm("Index", "Home", FormMethod.Get)) {
@Html.LabelFor(m => m.Paging)
@Html.DropDownListFor(m => m.Paging, Model.PageList)
}
@{
var webGird = new WebGrid(
Model.Students, rowsPerPage: Model.Paging, // modify this
....
提交表单的脚本
<script>
$('#Paging').change(function() {
$('form').submit();
});
</script>