ASP.NET MVC 4 DropDownList selectedindexchanged

时间:2015-09-01 09:35:09

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我在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());
    }

}

2 个答案:

答案 0 :(得分:2)

因此,当您转到第2页或第3页时,WebGrid会向服务器发送GET请求。在GET动作处理程序上你有这个:

ViewBag.rowsPerPage = 5;

所以你一直在重置rowsPerPage

实际上,rowsPerPage中处理这些更改的正确方法不应该是表单提交。当应该在服务器上更改数据时(例如写入DB),将使用POST请求。没有类似的事情发生在这里,所以正确的方法是:

  1. 让表单执行GET请求而不是POST

    @using (Html.BeginForm("Index", "Home", FormMethod.Get){
    ...
    
  2. 使WebGrid成为同一表单的一部分。

  3. 摆脱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;
        }
    
  4. 更改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();"})
    
  5. 另外,作为旁注,你应该考虑扩大你的模型以包含其中的所有数据,例如页面大小,用户选择,页码的选择 - 否则你的代码将变得越来越难以维护。 / 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>