代码之家  ›  专栏  ›  技术社区  ›  Ronnie Overby

HTML.ListBoxfor()的ASP.NET MVC问题

  •  2
  • Ronnie Overby  · 技术社区  · 14 年前

    我对helper html.listbox for()有问题。

    这是我的视图模型:

    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,字符串选项标签,字符串 名称,IEnumerable 1 selectList, Boolean allowMultiple, IDictionary 二 HTML属性)+723
    system.web.mvc.html.selectextensions.listbox帮助程序(htmlhelper) htmlhelper,字符串名称,IEnumerable 1 selectList, IDictionary 二 HTML属性)+47
    system.web.mvc.html.selectextensions.listbox for(htmlhelper 1 htmlHelper, Expression 1表达式, 可枚举的 1 selectList, IDictionary 2个HTMLattributes)+113
    system.web.mvc.html.selectextensions.listbox for(htmlhelper 一 HTMLHelper,表达式 1表达式, IEnumerable`1 selectlist)+85
    asp.views_reservation_new_aspx.uuu rendermaincontent(htmltextwriter _ w,控制参数container)在c:\code\gtcc烹饪中 保留\src\culinarreservation.webmvc\views\reservation\new.aspx:11 system.web.ui.control.renderchildrenInternal(htmlTextWriter) 作家,iCollection Children)+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.uu render_uuu control1(htmltextwriter _ w,控制参数container)在c:\code\gtcc烹饪中 reservation\src\culinarreservation.webmvc\views\shared\site.master:66 system.web.ui.control.renderchildrenInternal(htmlTextWriter) 作家,iCollection Children)+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 Children)+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更改为string,事情似乎会正常进行。但我读到的所有内容都表明这是一个应该在MVC2候选版本中修复的bug。

    我做错什么了吗?我不希望属性的类型是string,它必须是datetime。我不应该使用反映我问题的对象吗?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Darin Dimitrov    14 年前

    多选列表可以为空(例如,如果用户未进行选择),这意味着您无法绑定到值类型(如日期时间)。可以使用空值 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; }
    }
    
        2
  •  1
  •   Brian Mains    14 年前

    尝试将SelectedServiceDate设置为您的操作方法中的某个值,如datetime。现在或最近的某个值,然后查看是否可以解决此问题…没有指定日期,所以这是datetime.minvalue。