2009-09-16 91 views
6

我已阅读了大量关于此问题的内容,但我无法弄清楚。ASP.NET MVC DropDownList选定的值问题

我在我的视图上有一个用于分页的下拉列表。你选择你想要去的页面,然后表单被提交。当视图返回时,显示请求的页面。下拉列表发生变化以反映新显示的页面。这工作正常。

我的问题是这样的: 我有2个提交按钮,一个用于下一页,另一个用于上一页。 在控制器中,如果其中一个提交已被按下,页面#应该增加或减少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" /> 

请帮助。

编辑

页333 Pro ASP.NET MVC Framework by Steven Sanderson的:

如何输入控件得到他们的价值观

每个[用于渲染输入控件的HTML助手]的尝试 填充自身看对于值为 的以下位置,按此顺序 的优先级:

  1. ViewData.ModelState [“控件名称”。Value.RawValue
  2. 值参数传递到HTML helper方法,或者你已经称为 超载不包括值 参数,然后 的ViewData .Eval(“控件名称”)

的ModelState是一个临时存储区域 该ASP.NET MVC使用保留 传入试图值加上结合 和验证错误。请注意, 它位于优先级列表的顶端 ,因此它的值将覆盖您明确设置的任何内容。这个约定 意味着你可以传递一个明确的 值参数作为帮助者的默认或初始值 ;但是当 在 验证失败后重新渲染视图时,帮助程序将 保留用户输入的值优先于 优先于该默认值。

我已验证ViewData.ModelState [“Page”]。Value。RawValue确实包含令我困扰的意外页码。解决此问题的最佳方法是什么?

+1

+1非常好的使用字符串和模型绑定,使得可读的解析按钮被按下。 – 2009-09-16 21:10:05

+0

@丹 - 谢谢。我从史蒂文桑德森的Pro ASP.NET MVC框架中选择了奇才和多步骤形式部分(第396页) – 2009-09-17 12:19:44

+1

史蒂文桑德森的书很好。 – RichardOD 2009-09-17 15:23:44

回答

4

的问题是,ModelState中抱着下拉列表的价值传递。对于HtmlHelper输入控件,当在输入控件中显示一个值时,ModelState优先于显式设置的值。

以下是我在我的操作方法都做来解决这个问题:

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

我希望听到我修问题的其他途径。

+1

将页码直接放入动作中的模型状态,而不是清除它。您的选择列表将仅在页面列表中生成。 – Neal 2009-10-10 02:41:48

0

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

+0

在我提出问题之前,我曾这样做过,但为何不正常工作? – 2009-09-16 19:14:59

+0

浏览器正在缓存用户选择。通过使用JavaScript,您可以在回发之前更改用户选择(并因此更改浏览器对选择的印象)。另一种方法是将值放入页面头部,指定不缓存。这可能是也可能不是你所需要的,虽然... – 2009-09-16 20:38:50

+0

浏览器不应该缓存。表单方法是一个GET。这意味着页面参数在url中发送,这使得url是唯一的。 – 2009-09-17 00:42:42

0
  1. 确定您确定至少有一个NextPagePrevPage将为空? (你什么也得不到怪异像String.Empty迫使增量和减量?)
  2. .LastOrDefault()只有.Last()被取代,你确信你没有分配到default(int)search.Page
+0

1.)是的,我确定。 2.)该行代码与问题无关。 – 2009-09-16 18:56:57

0

以下是否有影响?

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

更换

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

这没有任何影响。 – 2009-09-17 12:23:13