【发布时间】:2018-08-17 12:59:20
【问题描述】:
我继承了一个需要更改的 ASP.NET MVC 项目(左图),因此我试图了解该项目的工作原理以及如何修复它。
这是一个记录和编辑时间表的应用程序 Timesheet snippet
当用户选择一个月时,显示屏会发生变化并显示该月的数据。问题是,前一个家伙不允许超过一年,所以点击 8(例如),显示今年和前几年的 8 月数据。我添加了年份按钮,以便用户可以选择年份。
控制器是:
public ActionResult MyTimesheets(int? month, int? year)
{
if(year == null)
{
year = DateTime.Now.Year;
}
if(month == null)
{
month = DateTime.Now.Month;
}
ViewBag.UserName = GetCurrentUserName();
// Get list of years in data for drop-down box
var yearList = new SelectList(contextdb.TimeSheetsDb.Select(y => y.TimeSheetDate.Year).Distinct().OrderByDescending(y => y.ToString()).ToList());
ViewData["YearList"] = yearList;
var myTimeSheets = contextdb.TimeSheetsDb.Include(x => x.UserTS).Where(x => x.UserTS.UPN == User.Identity.Name && x.TimeSheetDate.Month == month.Value && x.TimeSheetDate.Year == year.Value).ToList();
return View(myTimeSheets);
}
我添加了年份参数并更改了查询以过滤年份和月份。
他使用循环来创建每个月的按钮:
@for (int i = 1; i <= 12; i++)
{
if (Model.First().TimeSheetDate.Month == i)
{
@Html.ActionLink(i.ToString(), "MyTimesheets", new { month = i }, new { @class = "btn btn-success", style = "margin-left: 3px" });
}
else
{
@Html.ActionLink(i.ToString(), "MyTimesheets", new { month = i }, new { @class = "btn btn-default", style = "margin-left: 3px" });
}
}
我已经根据控制器中的视图数据添加了下拉列表:
<td>@Html.DropDownList("YearList", (IEnumerable<SelectListItem>)ViewData["YearList"], new { @onchange = "CallChangefunc(this.value)" })</td>
这有一个 onchange 事件,因此当用户选择不同的年份时,将使用该年份的新参数值调用 action 事件:
<script>
function CallChangefunc(val) {
var url;
url = "/TimeSheets/MyTimeSheets/?year=" + val;
window.location.href = url;
}
这行得通,我花了很长时间才到这里。
我现在纠结的是,如果用户点击不同月份的按钮,如何将新月份值和当前选择的年份作为年份参数传递给操作方法。
反之,如果更改年份,则通过 onchange 事件传递当前点击的月份。
【问题讨论】:
标签: asp.net-mvc parameters html.dropdownlistfor actionresult