MVC DropDownList在可选URL参数驱动时未显示选定值

时间:2013-04-27 20:08:55

标签: asp.net-mvc

我有一个Html.DropDownList,用于呈现用户可以选择的月份列表。如果首次显示页面(基本上没有请求参数),我希望默认选择当前月份。这是我无法开展的工作。无论当月如何,始终选择1月份。

有点奇怪的是,月值被选为偏移值而不是实际月值。因此,如果当前月份是4月,则月份列表如下所示:

Jan = -3,Feb = -2,Mar = -1,Apr = 0,May = 1,Jun = 2等等

(我是这样做的,所以我可以在没有直接指定年份的情况下回顾其他年份,因此我可以利用C#方法参数的默认值。)

我的控制器操作声明如下:

public ActionResult Index(string mode, int? locationID = 0, int monthOffset = 0)

monthOffset参数应该代表所选的月份。请注意,它的默认值为0.这应该意味着当前月份+ 0,基本上。但是当HTML呈现时,它总是显示所选列表中的第一个项目(1月),而不是实际值为0(4月)的项目。 1月的值为-3。

我已经验证我的SelectList对象选择了正确的月份,但HTML只是没有呈现该选择。我尝试将monthOffset参数设置为字符串,以防int类型混淆它,但这没有效果。

我想知道MVC是否看到值0并假设这总是意味着列表中的第一项,无论SelectList中实际出现“0”的位置......?

这是实际的GET操作。我想,很多都无关紧要。要看的主要是MonthOffsetList函数。

    public ActionResult Index(string mode, int? locationID = 0, int monthOffset = 0)
    {            
        ViewBag.LocationID = new SelectList(db.MyLocations(WebSecurity.CurrentUserName, true), "ID", "Name", locationID);
        // does not show current month on initial view
        ViewBag.MonthOffset = MonthOffsetList(monthOffset);

        if (mode == null || mode.Equals("m"))
        {
            DateTime viewDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(monthOffset);
            int year = viewDate.Year;
            int month = viewDate.Month;
            DateTimeFormatInfo dtf = new DateTimeFormatInfo();
            ViewBag.ViewMonth = dtf.GetMonthName(month) + " " + year.ToString();
            return View(new CalendarModel(year, month));
        }
        else
        {
            ViewBag.ViewMonth = "Next 30 Days from this week";
            return View(new CalendarModel());
        }
    }

    private SelectList MonthOffsetList(int selectedValue)
    {
        List<SelectListItem> results = new List<SelectListItem>();

        int month = 0;
        int year = DateTime.Today.Year;
        DateTimeFormatInfo dtf = new DateTimeFormatInfo();
        for (int offset = 1 - DateTime.Today.Month; offset < 13; offset++)
        {
            month++;
            if (month > 12) 
            {
                month = 1;
                year++;
            }
            results.Add(new SelectListItem()
            {
                Value = offset.ToString(),
                Text = (year == DateTime.Today.Year) ? dtf.GetMonthName(month) : dtf.GetMonthName(month) + " " + year.ToString()                    
            });
        }

        return new SelectList(results, "Value", "Text", selectedValue);
    }

以下是该观点的相关部分:

@using (Html.BeginForm())
{
<p class="center">
    Location:
    @Html.DropDownList("locationID", ViewBag.LocationID as SelectList, "(all)", new { onchange = "this.form.submit();" })

    View:        
    @Html.RadioButton("mode", "m", Request["mode"].IsEmpty() || Request["mode"].Equals("m"), new { id = "view_m", onclick="this.form.submit();" })
    @Html.Label("view_m", "Whole Month:")

    <input type="submit" value="&lt;&lt;" onclick="this.form.MonthOffset.value--;" />
// does not render current month correctly initially
    @Html.DropDownList("MonthOffset", ViewBag.MonthOffset as SelectList, new { onchange = "this.form.submit();" })        
    <input type="submit" value="&gt;&gt;" onclick="this.form.MonthOffset.value++;" />

    @Html.RadioButton("mode", "w", !Request["mode"].IsEmpty() && Request["mode"].Equals("w"), new { id = "view_w", onclick="this.form.submit();" })
    @Html.Label("view_w", "Continuous from this week")
</p>
}

0 个答案:

没有答案