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