ASP.NET MVC DropDownList选择值问题

Ron*_*rby 6 .net c# asp.net asp.net-mvc

我已经读过很多关于这个问题的内容,但我无法弄明白.

我的视图上有一个用于分页的下拉列表.您选择要转到的页面并提交表单.返回视图时,将显示请求的页面.下拉列表会更改以反映新显示的页面.这工作正常.

我的问题是:我有2个提交按钮,一个用于下一页,一个用于prev页面.在控制器中,如果已按下其中一个提交,则页面#应递增或递减1.这种情况正在发生,并且正在显示正确的数据页面.但是,下拉列表不会,无论我做什么,反映显示视图时的新页码.

基本上,如果用户更改了下拉列表,则会在表单提交后发送回来时反映这些更改.如果我以编程方式更改页面#,即使显示正确的数据页面,下拉列表也不会更改.

这是动作方法:

public ActionResult Results(TechSearch search, string NextPage, string PrevPage)
{
    if (NextPage != null) search.Page++;
    if (PrevPage != null) search.Page--;

    int resultCount = search.GetResultCount(Desk);

    List<int> pages = new List<int>();
    int pageCount = (int)Math.Ceiling((decimal)resultCount / search.PageSize);
    for (int i = 1; i <= pageCount; i++) pages.Add(i);        

    ViewData["pages"] = new SelectList(pages, search.Page);            
    ViewData["pageCount"] = pageCount;

    return View(search);
}
Run Code Online (Sandbox Code Playgroud)

以下是该观点的相关部分:

<input type="submit" value="<" name="PrevPage" />
Page
<%=Html.DropDownList("Page",(SelectList)ViewData["pages"]) %>
of
<%=ViewData["pageCount"]%>
<input type="submit" value=">" name="NextPage"  />
Run Code Online (Sandbox Code Playgroud)

请帮忙.

编辑

Steven SandersonPro ASP.NET MVC框架的第333页:

输入控件如何获取其值

[HTML Helpers for Rendering Input Controls]中的每一个都尝试通过在以下位置查找值来填充自己,按此优先级顺序:

  1. ViewData.ModelState [ "控件名称"].Value.RawValue
  2. 传递给HTML帮助器方法的value参数,或者如果您调用了不包含值参数的重载,则ViewData.Eval("controlName")

ModelState是一个临时存储区域,ASP.NET MVC用它来保留传入的尝试值以及绑定和验证错误.请注意,它位于优先级列表的顶部,因此其值会覆盖您可能显式设置的任何内容.此约定意味着您可以传递显式值参数以充当帮助程序的默认值或初始值; 但是在验证失败后重新呈现视图时,帮助程序将保留任何用户输入的值,而不是该默认值.

我已经验证了ViewData.ModelState ["Page"].Value.RawValue确实包含了纠缠我的意外页码.解决这个问题的最佳方法是什么?

Ron*_*rby 4

问题是 ModelState 保存着下拉列表的传入值。对于 HtmlHelper 输入控件,在输入控件中显示值时,ModelState 优先于显式设置的值。

以下是我在操作方法中为解决问题所做的操作:

ModelState.Remove("Page");
return View(search);
Run Code Online (Sandbox Code Playgroud)

我有兴趣听到解决我的问题的其他方法。