2010-02-18 49 views
2

我想使用Html.ListBoxFor幫手來顯示列表框並返回選定的ID。 dataValueField不是字符串有問題嗎?MVC ListBoxFor引發「值不能爲空」異常

如果模型中包含的SelectList使用整數作爲dataValueField,那麼當列表呈現在視圖中時,會出現「值不能爲空 - 參數名稱:源」異常。

如果將Id更改爲字符串,則一切正常,並將選定的Id傳回給視圖。

任何想法?

這裏是控制器(基於一個減少新項目)

namespace Mvc2.Controllers 
{ 
    public class ViewModel 
    { 
     public int TestId { get; set; } // if this is a string it works ok 
     public SelectList ListData {get; set;} 
    } 

    [HandleError] 
    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      var model = new ViewModel(); 
      model.TestId = 1; // code corrected after Lazarus' comment 

      var lst = new[] { new { Id = 1, Name = "cat" }, new { Id = 2, Name = "dog" } }; 
      model.ListData = new SelectList(lst, "Id", "Name"); 

      return View("TestView", model); 
     } 

     public ActionResult TestSubmit(ViewModel returnedModel) 
     { 
      int i = 99; // break here - returnedModel has correct TestId when declared as string 
     } 
    } 
} 

這裏是視圖 - 將ListBoxFor線

<%using (Html.BeginForm("TestSubmit", "Home")) { %> 

    <%=Model.TestId %><br /> 
    <%=Html.ListBoxFor(m => m.TestId, Model.ListData) %> 

    <br /> 
    <input type="submit" value="Save" /> 

<%} %> 

回答

2

回答我自己的問題;

我並不認爲這可能是一個等待修復的bug,因爲我在RC2和MVC 1中獲得它(我將代碼複製回該版本中的項目)。 無論如何,我已經實現了一個變通現在這是: -

(一)將ID添加的虛擬字符串版本的模型(TestId)

public class ViewModel 
{ 
    public string TestId { get; set; } // dummy Id as a string 
    public List<DataToShow> Data { get; set; } 
    public SelectList ListData {get; set;} 
} 

(B)顯示列表中,但檢索值作爲假TestId - 請注意,該列表仍將數據值轉儲爲整數!

<%=Html.ListBoxFor(m => m.TestId, Model.ListData) %> 

(三)虛擬字符串值複製到它應有的位置的整數中的作用

public ActionResult TestSubmit(ViewModel returnedModel) 
{ 
    MyModel.DataId = Int32.Parse(returnedModel.TestId); 

希望這是一些幫助。

+0

什麼是TestId?你是否在頁面上傳遞並呈現多個選擇? – Lazarus 2010-02-20 08:20:29

1

這是一個known issue with ASP.NET MVC 2崩潰。它應該在3月發行版中修復。

+0

此錯誤已在RC 2中修復。 – 2010-02-18 17:43:54

+0

我在2夜前得到了這個錯誤,並且我有最新版本。 (好吧,RC 2)。是否有*我失蹤的新版本? – 2010-02-18 18:19:58

+0

不,但是從其他地方描述你有不同的問題(可能在你的代碼中,也許在MVC代碼中)。另外,我已經接近確定Levi所描述的錯誤並不會導致這裏的行爲。沒有涉及(尚)'FormCollection',並且該參數具有不同的名稱。您可以查看RC 2源代碼中的FormCollection.GetValue(),以確認「string.IsNullOrEmpty()」確實已經消失。 – 2010-02-18 18:56:16

3

您傳遞給選定值的表達式需要IEnumerable,因爲ListBoxFor支持多個選定項目。

+2

多數民衆贊成在..如果你只想有一個單一的int/id那麼你應該使用DropDownListFor – 2011-07-22 17:48:13