我已经阅读了很多关于这个问题,但我无法弄明白。
我的视图上有一个用于分页的下拉列表。您选择要转到的页面并提交表单。返回视图时,将显示请求的页面。下拉列表会更改以反映新显示的页面。这很好。
我的问题是: 我有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);
}
以下是该观点的相关部分:
<input type="submit" value="<" name="PrevPage" />
Page
<%=Html.DropDownList("Page",(SelectList)ViewData["pages"]) %>
of
<%=ViewData["pageCount"]%>
<input type="submit" value=">" name="NextPage" />
请帮忙。
Pro ASP.NET MVC Framework by Steven Sanderson的第333页:
输入控件如何获取其值
每个[用于渲染输入控件的HTML帮助程序]都会尝试 通过寻找价值来填充自己 在以下地方,按此顺序 优先:
- ViewData.ModelState [ “控件名称”]。Value.RawValue
- 值参数传递给HTML帮助器方法,或者如果你调用了 不包含值的重载 那么参数 ViewData.Eval( “控件名称”)
醇>ModelState是一个临时存储区域 ASP.NET MVC用来保留 传入的尝试值加上绑定 和验证错误。请注意 它位于优先级列表的顶部, 所以它的价值会覆盖任何你 可能会明确设置。这个惯例 意味着你可以传递一个明确的 作为帮助者的值参数 默认值或初始值;但当 在a之后重新渲染视图 验证失败,帮助者会 保留任何用户输入的值 偏好默认。
我已经验证了ViewData.ModelState [“Page”]。Value.RawValue确实包含了纠缠我的意外页码。解决这个问题的最佳方法是什么?
答案 0 :(得分:4)
问题是ModelState持有下拉列表传递的值。对于HtmlHelper输入控件,在输入控件中显示值时,ModelState优先于显式设置值。
以下是我在解决问题的操作方法中所做的工作:
ModelState.Remove("Page");
return View(search);
我有兴趣听取解决问题的其他方法。
答案 1 :(得分:0)
在回发之前点击下一个或上一个按钮,使用javascript更改所选值。
答案 2 :(得分:0)
NextPage
或PrevPage
中的一个为空吗? (并且你没有得到任何奇怪的东西,如String.Empty
强制增量和减量?).LastOrDefault()
可以仅.Last()
替换default(int)
并确定您没有将search.Page
分配给{{1}}吗?答案 3 :(得分:0)
以下是否有任何影响?
ViewData["pages"] = new SelectList(pages,
pages.FirstOrDefault(p => p == search.Page ));
更换
ViewData["pages"] = new SelectList(pages, search.Page);