【问题标题】:ASP.NET MVC Problem with Html.ListBoxFor()Html.ListBoxFor() 的 ASP.NET MVC 问题
【发布时间】:2011-04-04 10:12:12
【问题描述】:

我遇到了帮助器 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: 值不能 为空。参数名称:source]
System.Linq.Enumerable.Cast(IEnumerable 来源)+4177011
System.Web.Mvc.Html.SelectExtensions.SelectInternal(HtmlHelper htmlHelper,字符串选项标签,字符串 名称,IEnumerable1 selectList, Boolean allowMultiple, IDictionary2 htmlAttributes) +723
System.Web.Mvc.Html.SelectExtensions.ListBoxHelper(HtmlHelper htmlHelper,字符串名称,IEnumerable1 selectList, IDictionary2 htmlAttributes) +47
System.Web.Mvc.Html.SelectExtensions.ListBoxFor(HtmlHelper1 htmlHelper, Expression1 表达式, IEnumerable1 selectList, IDictionary2 htmlAttributes) +113
System.Web.Mvc.Html.SelectExtensions.ListBoxFor(HtmlHelper1 htmlHelper, Expression1 表达式, IEnumerable`1 selectList) +85
ASP.views_reservation_new_aspx.__RenderMainContent(HtmlTextWriter __w,控制参数容器)在 c:\code\GTCC Culinary 预订\src\CulinaryReservation.WebMVC\Views\Reservation\New.aspx:11 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter 作家,ICollection 儿童)+109
System.Web.UI.Control.RenderChildren(HtmlTextWriter 作家)+8
System.Web.UI.Control.Render(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
ASP.views_shared_site_master.__Render__control1(HtmlTextWriter __w,控制参数容器)在 c:\code\GTCC Culinary 预订\src\CulinaryReservation.WebMVC\Views\Shared\Site.Master:66 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter 作家,ICollection 儿童)+109
System.Web.UI.Control.RenderChildren(HtmlTextWriter 作家)+8
System.Web.UI.Control.Render(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
System.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) +3060

This post 描述了同样的问题。就像那篇文章一样,如果我将我的 NewReservation.SelectedServiceDate 从 DateTime 更改为字符串,那么一切似乎都有效。但我读过的所有内容都表明这是一个应该在 MVC2 候选版本中修复的错误。

我做错了吗?我不希望属性的类型是字符串,它需要是 DateTime。我不应该能够使用反映我的问题的对象吗?

【问题讨论】:

    标签: c# .net asp.net asp.net-mvc


    【解决方案1】:

    多选列表可能为空(例如,如果用户未进行选择),这意味着您无法绑定到值类型(如 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; }
    }
    

    【讨论】:

    • 将属性更改为日期时间?工作。我不想允许多选,所以我改为 DropDownListFor() 并传入一个 size 属性。
    • @Ronnie,您要查找的内容在 HTML 中没有等效标记。在select 标签中,如果您没有multiple 属性,则可以选择单个选项(呈现为下拉菜单),如果您设置multiple 标签,则无论您获得什么值(甚至为空)一个列表框,您始终可以在其中选择多个值。因此,如果您想要一个选择,请使用Html.DropDownListFor。参考:w3.org/TR/html401/interact/forms.html#adef-multiple
    • 这个解释对我来说很有意义,为什么如果你使用字符串而不是其他数据类型它会起作用:字符串允许空值。我只是希望 listboxfor 以某种方式阻止您进行单一选择。除非您非常熟悉 HTML 规范或 MVC 工作原理,否则使用 nullable 或 IEnumerable 尚不清楚。
    【解决方案2】:

    尝试将 SelectedServiceDate 设置为您的操作方法中的某个值,例如 DateTime.Now 或最近的某个值,看看这是否能解决问题...没有分配日期,所以这是 DateTime.MinValue。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2011-11-17
      • 2010-11-03
      相关资源
      最近更新 更多