【问题标题】:Next / Previous Week Functions in ASP.NET MVC Entity Framework下周/上周 ASP.NET MVC 实体框架中的函数
【发布时间】:2015-03-19 14:48:15
【问题描述】:

所以我创建了一个每周导航并在数据库中显示 timereports 数据的函数,问题是它只能导航一次而不能进一步导航,我需要一些帮助。

型号:

using System;
using System.Globalization;

namespace ReportSystem.ViewModel
{
    public static class WeekConverter
    {
        public static DateTime FirstDateOfWeek(int year, int weekOfYear)
        {
            var jan1 = new DateTime(year, 1, 1);
            var daysOffset = DayOfWeek.Thursday - jan1.DayOfWeek;
            var firstThursday = jan1.AddDays(daysOffset);
            var cal = CultureInfo.CurrentCulture.Calendar;
            var firstWeek = cal.GetWeekOfYear(firstThursday, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
            var weekNum = weekOfYear;

            if (firstWeek <= 1)
            {
                weekNum -= 1;
            }

            var result = firstThursday.AddDays(weekNum * 7);

            return result.AddDays(-3);
        }

        public static int GetIso8601WeekOfYear(DateTime time)
        {
            var day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);

            if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
            {
                time = time.AddDays(3);
            }

            return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
        } 
    }
}

查看:

@model IEnumerable<ReportSystem.Models.TimeReports>

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Week: @((DateTime)ViewBag.Date)</h2>

<p>
    @Html.ActionLink("Create New", "Create", "TimeReports") |
    @Html.ActionLink("Create New Day Off", "Index", "Other")
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Project.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Consultants.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.TotalHours)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.TimeType)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.OnSite)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Description)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Date)
        </th>
        <th></th>
    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Project.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Consultants.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.TotalHours)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.TimeType)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.OnSite)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Description)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Date)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.Id })
            </td>
        </tr>
    }
</table>
<p>
    @Html.ActionLink("Previous Week", "PreviousWeek", "TimeReports") |
    @Html.ActionLink("Next Week", "NextWeek", "TimeReports")
</p>

控制器:

using System;
using System.Data;
using System.Linq;
using System.Web.Mvc;
using ReportSystem.Models;
using ReportSystem.ViewModel;

namespace ReportSystem.Controllers
{
    public class TimeReportsController : Controller
    {
        private readonly ReportsDatabaseEntities _db = new ReportsDatabaseEntities();

        public ActionResult Index()
        {
            var weekNr = WeekConverter.GetIso8601WeekOfYear(DateTime.Now);
            var startTime = WeekConverter.FirstDateOfWeek(DateTime.Now.Year, weekNr);
            var endTime = startTime.AddDays(6).AddHours(23).AddMinutes(59).AddSeconds(59);
            var consultantId = (int)Session["Id"];

            var timeReports = _db.TimeReports.Where(s => s.Date >= startTime && s.Date <= endTime)
                .Where(s => s.ConsultantID == consultantId).ToList();

            ViewBag.Date = startTime;

            return View(timeReports);
        }

        public ActionResult PreviousWeek()
        {
            var weekNr = WeekConverter.GetIso8601WeekOfYear(DateTime.Now); //The value keeps staying at same week...
            var startTime = WeekConverter.FirstDateOfWeek(DateTime.Now.Year, weekNr);
            startTime = startTime.AddDays(-7);
            var endTime = startTime.AddDays(6).AddHours(23).AddMinutes(59).AddSeconds(59);
            var consultantId = (int)Session["Id"];

            var timeReports = _db.TimeReports.Where(s => s.Date >= startTime && s.Date <= endTime)
                .Where(s => s.ConsultantID == consultantId).ToList();

            ViewBag.Date = startTime;

            return View("Index", timeReports);
        }

        public ActionResult NextWeek()
        {
            var weekNr = WeekConverter.GetIso8601WeekOfYear(DateTime.Now);//The value keeps staying at same week...
            var startTime = WeekConverter.FirstDateOfWeek(DateTime.Now.Year, weekNr);
            startTime = startTime.AddDays(7);
            var endTime = startTime.AddDays(6).AddHours(23).AddMinutes(59).AddSeconds(59);
            var consultantId = (int)Session["Id"];

            var timeReports = _db.TimeReports.Where(s => s.Date >= startTime && s.Date <= endTime)
                .Where(s => s.ConsultantID == consultantId).ToList();

            ViewBag.Date = startTime;

            return View("Index", timeReports);
        }

任何帮助将不胜感激。

【问题讨论】:

  • 您已经在几个小时前问过这个问题here。请删除其中一个。

标签: c# asp.net asp.net-mvc linq asp.net-mvc-4


【解决方案1】:

此 ActionResult "NextWeek()" 需要开始星期参数,否则一周始终相同 (DateTime.Now)

使用参数创建地图路线我不舒尔,但看看这个来构建地图根

routes.MapRoute("Default", "{controller}/{action}/{id}",
    new {controller = "TimeReports", 
    action = "PreviousWeek", 
    WeekStart = UrlParameter.Optional})

查看此以获取构建地图路线的帮助ASP.net mvc ActionResult parameter

【讨论】:

  • 参数应该是什么样子?
  • 查看类似@Html.ActionLink("Previous Week", "PreviousWeek", "TimeReports", new { WeekStart =@ViewBag.PreviousDate }); 和模型ActionResult PreviousWeek( DateTime WeekStart )
【解决方案2】:

假设初始视图呈现本周的时间报告集合,并且您希望链接重定向到呈现下/前几周的报告集合的视图,那么您需要一种方法,该方法具有一个参数标识星期。处理DateTime 属性可能会出现问题,因此在本例中,我将使用int 标识相对于当前周的周

public ActionResult Index(int ID = 0)
{
  DateTime firstOfWeek = DateTime.Today.AddDays(ID * 7).FirstOfWeek() // see notes below
  DateTime lastofWeek = firstOfWeek.AddDays(7).AddSeconds(-1);
  var consultantId = (int)Session["Id"];
  var timeReports = _db.TimeReports.Where(s => s.Date >= firstOfWeek && s.Date <= lastofWeek).Where(s => s.ConsultantID == consultantId); // don't need .ToList()
  ViewBag.PreviousWeek = ID - 1; // better to use a view model rather than ViewBag
  ViewBag.NextWeek = ID + 1; 
  return View("Index", timeReports);
}

然后在视图中

@model IEnumerable<ReportSystem.Models.TimeReports>
<table>
  ....
</table>
@Html.ActionLink("Previous Week", "Index", "TimeReports", new { ID = ViewBag.PreviousWeek })
// Assume you don't want to navigate to a future week
@if (ViewBag.NextWeek < 0)
{
  @Html.ActionLink("Next Week", "Index", "TimeReports" new { ID = ViewBag.NextWeek })
}

我无法理解您的 WeekConverter 类中的代码应该做什么。如果你想获得一周的第一天,那么创建一个简单的扩展方法

// Extension method to return the first  day of the week (Sunday).
public static DateTime FirstOfWeek(this DateTime date)
{
  return date.AddDays(DayOfWeek.Sunday - date.DayOfWeek);
}
// Extension method to return the first working day of the week (Monday).
public static DateTime FirstOfWorkingWeek(this DateTime date)
{
  return date.AddDays(DayOfWeek.Monday - date.DayOfWeek);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多