2010-08-26 73 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。