2010-08-26 68 views
2

我遇到了幫助器Html.ListBoxFor()的問題。ASP.NET MVC問題與Html.ListBoxFor()

這裏是我的ViewModel:

public class NewReservation 
{ 
    public SelectList AvailableServiceDates { get; set; } 
    public DateTime SelectedServiceDate { get; set; } 
} 

這裏是我的操作方法:

public virtual ActionResult New() 
    { 
     NewReservation newReservation = new NewReservation(); 
     newReservation.AvailableServiceDates = new SelectList(nhSession.Linq<Service>().Select(x => x.DateTime).Distinct()); 
     return View(newReservation); 
    } 

在我看來:

<%:Html.ListBoxFor(x => x.SelectedServiceDate, Model.AvailableServiceDates) %> 

這裏是個例外:

值不能爲空。參數名: 源

堆棧跟蹤:

[ArgumentNullException:值不能 爲空。參數名稱:源]
System.Linq.Enumerable.Cast(IEnumerable的 源)4177011
System.Web.Mvc.Html.SelectExtensions.SelectInternal(的HtmlHelper 的HtmlHelper,字符串optionLabel,字符串 名,IEnumerable的 htmlAttributes)723
System.Web.Mvc.Html.SelectExtensions.ListBoxHelper(的HtmlHelper 的HtmlHelper,字符串名稱,IEnumerable的 htmlAttributes)47
System.Web.Mvc.Html.SelectExtensions.ListBoxFor(的HtmlHelper 1 htmlHelper, Expression 1表達式, IEnumerable 1 selectList, IDictionary 2 htmlAttributes)113
System.Web.Mvc.Html.SelectExtensions.ListBoxFor(的HtmlHelper 1 htmlHelper, Expression 1的表達, IEnumerable`1的SelectList)85
ASP.views_reservation_new_aspx .__ RenderMainContent(HtmlTextWriter的 __w,控制parameterContainer在c)中:\代碼\ GTCC烹飪 預訂的\ src \ CulinaryReservation.WebMVC \查看\預訂\ New.aspx:11 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter的作家 ,ICollection的兒童)+109
的System.Web。 UI.Control.RenderChildren(HtmlTextWriter writer)+8
System.Web.UI.Control.Render(HtmlTextW riter 作家)+10
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter的作家 ,的ControlAdapter適配器)+27
System.Web.UI.Control.RenderControl(HtmlTextWriter的作家 ,的ControlAdapter適配器)+100
System.Web.UI.Control.RenderControl在C(HtmlTextWriter的 作家)25
ASP.views_shared_site_master .__ Render__control1(HtmlTextWriter的 __w,控制parameterContainer):\代碼\ GTCC烹飪 預訂\ SRC \ CulinaryReservation.WebMVC \視圖\ Shared \ Site.Master:66 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter 作家,ICollection兒童)+109
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)+8
System.Web.UI.Control。渲染(HtmlTextWriter的 作家)+10
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter的作家 ,的ControlAdapter適配器)+27
System.Web.UI.Control.RenderControl(HtmlTextWriter的作家 ,的ControlAdapter適配器)+100
System.Web.UI.Control.RenderControl(HtmlTextWriter的 作家)+25
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter的作家 ,ICollection的兒童)+208
System.Web.UI.Control.RenderChildren (HtmlTextWriter 作家)+8
Syst em.Web.UI.Page.Render(HtmlTextWriter的 作家)29
System.Web.Mvc.ViewPage.Render(HtmlTextWriter的 作家)56
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter的 作家,的ControlAdapter適配器)+27
System.Web.UI.Control.RenderControl(HtmlTextWriter的作家 ,的ControlAdapter適配器)+100
System.Web.UI.Control.RenderControl(HtmlTextWriter的 作家)+25
的System.Web。 UI.Page.ProcessRequestMain(布爾型 includeStagesBeforeAsyncPoint,布爾型 includeStagesAfterAsyncPoint)+30 60

This post描述了同樣的問題。就像那篇文章,如果我將NewReservation.SelectedServiceDate從DateTime更改爲字符串,事情似乎工作。但是我讀過的所有內容都表明這是一個應該在MVC2候選版本中修復的錯誤。

我做錯了什麼?我不希望該屬性的類型是字符串,它需要是DateTime。我不應該能夠使用反映我的問題的對象嗎?

回答

3

多選列表可能爲空(例如,如果用戶沒有選擇),這意味着您無法綁定到值類型(如DateTime)。你可以使用一個可以爲空DateTime來代替:

public class NewReservation 
{ 
    public SelectList AvailableServiceDates { get; set; } 
    public DateTime? SelectedServiceDate { get; set; } 
} 

還要注意多選擇列表中的用戶可以進行多項選擇意味着綁定到一個單一的日期似乎不很自然。恕我直言,這將是更自然有這樣的:

public class NewReservation 
{ 
    public SelectList AvailableServiceDates { get; set; } 
    public IEnumerable<DateTime> SelectedServiceDates { get; set; } 
} 
+0

將屬性更改爲DateTime?工作。我不想允許多個選擇,所以我更改爲DropDownListFor()並傳入一個size屬性。 – 2010-08-26 18:19:40

+0

@Ronnie,你要找的東西在HTML中沒有等價的標籤。在'select'標籤中,如果你沒有'multiple'屬性,你可以選擇一個選項(呈現爲下拉菜單),如果你設置了'multiple'標籤,不管你輸入什麼值(甚至是空的)一個列表框,您可以隨時選擇多個值。所以,如果你想單個選擇使用'Html.DropDownListFor'。參考:http://www.w3.org/TR/html401/interact/forms.html#adef-multiple – 2010-08-26 18:27:09

+0

這個解釋對我有意義,爲什麼它在你使用字符串而不是另一種數據類型時工作:字符串允許空值。我只希望列表框以某種方式阻止你進行單一選擇。除非您對HTML規範或MVC工作非常熟悉,否則不清楚使用可爲空或IEnumerable。 – yamspog 2011-04-05 01:14:30

1

嘗試SelectedServiceDate設置的東西在你的操作方法類似DateTime.Now或最近的東西,看看是否能解決......沒有註明日期被分配的問題,所以這是DateTime.MinValue。