我有一个 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="<<" 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=">>" 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>
}