ASP.NET MVC DropDownList选择值问题

我已经阅读了很多关于这个问题,但我无法弄明白。

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

我的问题是:我有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 pages = new List(); 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); } 

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

 <input type="submit" value=" Page  of  " name="NextPage" /> 

请帮忙。

编辑

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

输入控件如何获取其值

每个[用于渲染输入控件的HTML帮助程序]都尝试通过在以下位置查找值来填充自身,按此优先级顺序排列:

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

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

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

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

以下是我在修复问题的操作方法中所做的事情:

 ModelState.Remove("Page"); return View(search); 

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

在回发之前,单击下一个或上一个按钮,使用javascript更改所选值。

  1. 您确定至少有一个NextPagePrevPage将为空吗? (并且你没有像String.Empty强制增加和减少一样奇怪吗?)
  2. 可以.LastOrDefault()替换为.Last() ,你确定你没有为search.Page分配default(int)

以下是否有任何影响?

 ViewData["pages"] = new SelectList(pages, pages.FirstOrDefault(p => p == search.Page )); 

更换

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