模型从下拉列表中返回 null

Model returning null from drop down

我创建了一个下拉列表,其中选择了一个值,但是当我去保存它时,它 returns 模型的空值。

我创建列表的代码

var startYearList = from r in Model.Facility.Reports.OrderByDescending(x => x.Year)
            select new SelectListItem
            {
                Text = r.Year == null ? "0000" : r.Year.ToString(),
                Value = r.Year == null ? "1/1/0001" : "1/1/" + r.Year.ToString(),
                Selected = (r.Year == Convert.ToInt32((Model.StartDate != null ? Model.StartDate.Value.ToString("yyyy") : "0001")))
            };

我用于填充下拉列表的代码。

    <div>
        <b>Mailing Address:</b><br />
        <label>Address 1</label>
        @Html.TextBoxFor(model => model.Address1)<br />
        <label>Address 2</label>
        @Html.TextBoxFor(model => model.Address2)<br />
        <span class="dynLocation">@Html.TextBoxFor(model => model.Zipcode.Id)</span><br />
        <br />
        From @Html.DropDownListFor(model => model.StartDate.Value, startYearList)            
        to @Html.DropDownListFor(model => model.EndDate.Value, endYearList, "Current")            
    </div>

结束日期可以为空

在模型值可以为空的情况下,我发现使用 Html.DropDownList 效果更好。

您可能会发现生成的 select 列表的名称是 "StartDate_Value",因此与模型中的变量名称不对应。

 @Html.DropDownList("StartDate", startYearList)

您将下拉列表绑定到 Nullable<DateTime>Value 属性,这是只读的 属性 (refer documentation),当您post回来了。相反,您需要绑定到 属性

@Html.DropDownListFor(m => m.StartDate, startYearList)
@Html.DropDownListFor(m => m.EndDate, endYearList, "Current")

旁注

  1. 您应该在控制器中生成 SelectList,而不是 视图,并将其分配给(最好)视图模型 属性 或 ViewBag属性
  2. 请勿尝试设置 SelectListItemSelected 属性。你 绑定到模型 属性 及其 属性 的值 确定选择的内容(Selected 的值 SelectListItem 被忽略)
  3. A html <label> 元素是一种无障碍元素,旨在 允许您将焦点设置到关联的控件 您的用法 label>Address 1</label> 不将标签与 控制(你也可以只使用 <span>Address 1</span>)。反而 使用 @Html.LabelFor(m => m.Address1, "Address 1") 或添加 [Display(Name = "Address 1")] 属性到 属性 并使用 @Html.LabelFor(m => m.Address1)