0

我有一个 Html.DropDownList 呈现月份列表供用户选择。如果第一次显示页面(基本上没有请求参数),我希望默认选择当前月份。这是我无法上班的地方。无论当前月份如何,最初总是选择一月。

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

一月 = -3,二月 = -2,三月 = -1,四月 = 0,五月 = 1,六月 = 2,依此类推

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

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

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

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

0 回答 0