2014-01-20 57 views
3

我有一個mvc DropDownList的問題,很多的話題,但沒有一個具有相同的問題。asp.net mvc 5 DropDownList可空int的默認選項不爲空

我想爲我的DropDownList默認選擇的選項,但我也需要額外的選項「所有」項目的選擇。

的2所以我控制器綁定默認值到下拉

public ActionResult Index(int? All = 2){ ... 

在CSHTML我有

@Html.DropDownList("All","All items") 

所有列表充滿這樣

ViewData["All"] = new SelectList(CommonLists.property_types.Select(x => new { v = x.Value, t = x.Key.ToLower() }), "v", "t", All); 

property_types

public static Dictionary<string, int> property_types = new Dictionary<string, int>() { 
    { "House", 1 }, { "Flat", 2 }, { "Garden", 3 } 

因此,它應該像這樣工作

  • 當第一次進入默認選擇的值是2,等於「扁平化」,只顯示「扁平化」項目(工程)
  • 用戶可以將其更改爲從列表中的其他選項(作品)
  • 用戶可以更改查看所有項目一次不管類別中選擇「所有項目」(這是不工作)

我假定它應該工作,但我驚訝,當我選擇「所有項目s「mvc不返回null它只是返回默認的int值,所以基本上沒辦法查詢所有項目。

這是否應該這樣工作?自動生成的「所有項目」是空值,所以我認爲mvc會將它翻譯爲空,但事實並非如此。

如何解決這個問題?

回答

4

問題不在於POST不返回null,而是由POST返回null

由於您的操作默認值爲。當動作正在接收null了它的初始化與默認值的變量,在這種情況下

public ActionResult Index(int? All = 2) 

你想這樣做,才能夠「所有項目」和默認行爲區分什麼應用程序。這種情況下,默認行爲是僅顯示單位

您可以通過在控制器內部構建「所有項目」來實現該目標。

public ActionResult Index(int? All = 2) 
{ 
    var propertyTypesSelectList = new SelectList(property_types.Select(x => new {v = x.Value, t = x.Key.ToLower()}), "v", "t", All).ToList(); 
    propertyTypesSelectList.Insert(0, new SelectListItem() { Value = "0", Text = "All items"}); 

    ViewData["All"] = propertyTypesSelectList; 
    return View(); 
} 

並更改您的視圖這個

@Html.DropDownList("All") 
+0

當時懷疑這將是這種情況下,MVC應該在這次更聰明,如果他們提供了添加默認選項一個選項,它應該,如果它返回null有空值,而不是我的默認值2,特別是如果它是可空的int。也許最好使用自定義參數綁定器修復它,會看到。 – Programista

+0

這不是MVC的問題。你賦予null值雙重含義。 'null'從回發意味着「所有項目」,而最初的'null'意味着「取得默認值」。如果你刪除'= 2'到你的動作。然後你以前的代碼將工作,但默認值是「所有項目」,而不是「平坦」 –

+0

是的,這是一個MVC問題。 如果我沒有提供任何值,意味着沒有形式POST「全部」字段發送它應該是2,但是如果我選擇「所有項目」表單POST字段「全部」值爲空發送,控制器應該然後獲得一個空值。 這不是一個雙重含義的問題,它是一個問題,即mvc無法識別請求中的POST字段與POST字段之間但具有空值的情況,這是兩個不同的事情。 事實上,它應該以最直觀的方式工作,就像我在我的問題中所展示的那樣簡單,沒有必要的解決方法,但它不會。 – Programista