Viewbag Fed DropdownFor - 一旦 Action 具有参数,就删除选定的 属性

Viewbag Fed DropdownFor - Removes Selected property once Action has Param

好的,这里很奇怪....

我有一个下拉列表视图,其中包含 4 天前和今天的日期...

当 Index(Action) 启动时 DateTime 为 null 时,DropDownList 会显示当前日期已经选择...太棒了!

HTML 来源 URL \Controller\Index

    <select class="form-control" id="Date" name="Date" onchange="Change_Date(this)"
    <option value="23/10/2017">23/10/2017</option>
    <option value="24/10/2017">24/10/2017</option>
    <option value="25/10/2017">25/10/2017</option>
    <option value="26/10/2017">26/10/2017</option>
    <option selected="selected" value="27/10/2017">27/10/2017</option>
    </select>

当使用 DateTime 启动 Index(Action) 时,即使它经历了完全相同的过程,我也可以在 ViewBag.DateList 中实际看到 Selected=True 属性...下拉菜单没有选择选项并恢复到第一个。

HTML 来源 URL \Controller\Index?date=2017-10-26

    <select class="form-control" id="Date" name="Date" onchange="Change_Date(this)"
    <option value="23/10/2017">23/10/2017</option>
    <option value="24/10/2017">24/10/2017</option>
    <option value="25/10/2017">25/10/2017</option>
    <option value="26/10/2017">26/10/2017</option>
    <option value="27/10/2017">27/10/2017</option>
    </select>

我试过绕过 JS 并将日期时间直接放在 URL 中,但运气不好所以不是那样...

我不明白为什么 URL 中的 ?date=date 会从选项元素中删除选定的 属性...

需要说明的是,在这两种情况下,Selected = True 属性 存在于 ViewBag.DateList 中,但在将参数传递到操作中时它不会按预期呈现。

查看

@Html.DropDownList("Date", (IEnumerable<SelectListItem>)ViewBag.DateList, 
    new { @class = "form-control", @onchange="Change_Date(this)" })

方法

  public ActionResult Index(DateTime? date)
    {
        if (date.HasValue == false)
        {
            date = DateTime.Now.Date;
        }
        List<SelectListItem> Dates = new List<SelectListItem>();
        for (int i = -4; i < 1; i++)
        {
            string date_display = DateTime.Now.Date.AddDays(i).ToShortDateString();
            Dates.Add(new SelectListItem { Text = date_display, Value =date_display});
        }

        foreach (SelectListItem item in Dates)
        {
            if (item.Value == date.ToShortDateString())
                item.Selected = true;
        }
        ViewBag.DateList = Dates;
     }

JS

function Change_Date(val)
{
    var value = $('#Date').val();
    value = value.split("/").reverse().join("-");
    var url = "/Controller/Index?date=" + value;
    window.location.href = url;
}
url 中的

?date=datedate 的值添加到 ModelState,因为您的方法中有一个名为 date 的参数。生成表单控件的 HtmlHelper 方法使用来自 ModelState 的值进行绑定(如果存在)(然后来自 ViewData,最后来自实际模型 属性)。有关行为的解释,请参阅 this answer 的第二部分。

内部 DropDownList()(和 DropDownListFor())方法构建一个新的 IEnumerable<SelectListItem> 并根据 [=] 设置 Selected 属性 的值55=] 如果不是 null.

你的绑定到(在你的情况下 Date

当您使用 ../Controller/Index?date=2017-10-26 重定向时,date 参数的值(和 ModelState 值)变为 26/10/2017 12:00:00 AM。当 DropDownList() 方法通过遍历 ViewBag.DateList 构建其 IEnumerable<SelectListItem> 时,它会将 SelectListItem 值的 .ToString() 属性 与 dateModelState 中没有找到任何匹配项(字符串 "26/10/2017 12:00:00 AM" 不等于 "26/10/2017"),因此没有选项被设置为选中。

选择正确选项的一些选项包括

  1. 在你之前的控制器方法中添加ModelState.Clear() return 视图。
  2. 更改方法中参数的名称,或名称 在下拉列表中,因此它们不匹配,例如 @Html.DropDownList("SelectedDate", ...)