ASP.NET MVC DropDownList选择值问题

时间:2009-09-16 18:36:44

标签: c# .net 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);
}

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

<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帮助程序]都会尝试   通过寻找价值来填充自己   在以下地方,按此顺序   优先:

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

    ModelState是一个临时存储区域   ASP.NET MVC用来保留   传入的尝试值加上绑定   和验证错误。请注意   它位于优先级列表的顶部,   所以它的价值会覆盖任何你   可能会明确设置。这个惯例   意味着你可以传递一个明确的   作为帮助者的值参数   默认值或初始值;但当   在a之后重新渲染视图   验证失败,帮助者会   保留任何用户输入的值   偏好默认。

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

4 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  1. 您确定至少有NextPagePrevPage中的一个为空吗? (并且你没有得到任何奇怪的东西,如String.Empty强制增量和减量?)
  2. .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);