未在下拉列表中设置所选值

时间:2017-07-13 18:28:42

标签: asp.net-mvc combobox html-select

我几天前问了一个类似的问题,没有提到我的页面上有第二个下拉列表。第一个列表使用Html.DropDownList,我的第二个列表使用select语句。

我能够使用我提供的解决方案将重新发布的所选项目渲染到第一个下拉列表(SelectedItem)。但是当我尝试将相同的技术应用到我的第二个下拉列表(SortSelect)时,它失败了。

我不明白为什么,因为它们都是由id识别的,我使用相同的ViewBag语句将我想要显示的数据发送回视图。我的第二个下拉列表导致所选项目无法呈现,我做错了什么?

我提前道歉,因为无法建立连接并解决了基本相同问题的第二次迭代。我对.Net很新,还在学习基础知识。

我的观点

// This is the first dropdown list
@Html.DropDownList("SelectedItem", Model.ReverseMonthsLists(),
    new { @onchange = "CallChangeFunction(this.value)" })

// This is the second dropdown list 
<select id="SortSelect" onchange="CallChangeFunction(value)">
    <option value="default">Default</option>
    <option value="make">Make</option>
    <option value="model">Model</option>
    <option value="year">Year</option>
</select>

// This is my javascript
@section scripts
{
    <script>
        function CallChangeFunction() {
            var dateItem = document.getElementById("SelectedItem").value;
            var sortItem = document.getElementById("SortSelect").value;
            window.location.href = "/dashboard/Report_Performance?dateItem=" + dateItem + "&sortItem=" + sortItem;
            }
    </script>
}

我的控制器

public ActionResult Report_Performance(string dateItem, string sortItem)
{
    DateTime newDate = DateTime.Now.Date.AddMonths(-1);
    if (dateItem != null && dateItem != "")
        newDate = DateTime.Parse(dateItem);
    var aVar = Models.Reporting.ListingStatsReportingViewModel.GetStats(userCurrentService.CompanyId.Value, Models.Reporting.DateTimePeriod.Monthly, newDate);

    if (sortItem == "make")
        aVar.CurrentListingStats = aVar.CurrentListingStats.OrderBy(i => i.Make).ToList();
    else if (sortItem == "model")
        aVar.CurrentListingStats = aVar.CurrentListingStats.OrderBy(i => i.Model).ToList();
    else if (sortItem == "year")
        aVar.CurrentListingStats = aVar.CurrentListingStats.OrderBy(i => i.Year).ToList();

    ViewBag.SelectedItem = dateItem;  //<- THIS ONE WORKS FINE
    ViewBag.SortSelect = sortItem;    //<- THIS IS NOT WORKING, IT'S IGNORED BY THE VIEW

    return this.View(aVar);
}

1 个答案:

答案 0 :(得分:1)

好的,您的第二个下拉列表是标准HTML,因此您必须编写更多代码才能设置&#39;选定的值。忽略第一个列表和JS方法(它们可以保持不变),可以尝试这个:

视图

@{
   string _sortItem = ViewBag.SortSelect == null ? "" : ViewBag.SortSelect;
}
...

<select id="SortSelect" onchange="CallChangeFunction(value)">
    <option value="default" @(_sortItem=="default" ? Html.Raw("selected") : Html.Raw(""))>Default</option>
    <option value="make" @(_sortItem=="make" ? Html.Raw("selected") : Html.Raw(""))>Make</option>
    <option value="model" @(_sortItem=="model" ? Html.Raw("selected") : Html.Raw(""))>Model</option>
    <option value="year" @(_sortItem=="year" ? Html.Raw("selected") : Html.Raw(""))>Year</option>
</select>

...

老实说,我让它更具动态性(就像其他列表一样)并从控制器提供列表值(通过ViewBag),然后在View中也使用@Html.DropDownList(...