2009-09-16 105 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