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=date
将 date
的值添加到 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()
属性 与 date
在 ModelState
中没有找到任何匹配项(字符串 "26/10/2017 12:00:00 AM"
不等于 "26/10/2017"
),因此没有选项被设置为选中。
选择正确选项的一些选项包括
- 在你之前的控制器方法中添加
ModelState.Clear()
return 视图。
- 更改方法中参数的名称,或名称
在下拉列表中,因此它们不匹配,例如
@Html.DropDownList("SelectedDate", ...)
好的,这里很奇怪....
我有一个下拉列表视图,其中包含 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;
}
?date=date
将 date
的值添加到 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()
属性 与 date
在 ModelState
中没有找到任何匹配项(字符串 "26/10/2017 12:00:00 AM"
不等于 "26/10/2017"
),因此没有选项被设置为选中。
选择正确选项的一些选项包括
- 在你之前的控制器方法中添加
ModelState.Clear()
return 视图。 - 更改方法中参数的名称,或名称
在下拉列表中,因此它们不匹配,例如
@Html.DropDownList("SelectedDate", ...)