C# ASP.NET MVC实体框架中的下周/上周函数

C# ASP.NET MVC实体框架中的下周/上周函数,c#,asp.net,asp.net-mvc,linq,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Linq,Asp.net Mvc 4,所以我创建了一个函数,它每周导航一次,并在数据库中显示timereports数据,问题是它只能导航一次,不能再导航了,我需要一些帮助 型号: using System; using System.Globalization; namespace ReportSystem.ViewModel { public static class WeekConverter { public static DateTime FirstDateOfWeek(int year,

所以我创建了一个函数,它每周导航一次,并在数据库中显示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);
        } 
    }
}
使用系统;
利用制度全球化;
命名空间ReportSystem.ViewModel
{
公共静态类WeekConverter
{
公共静态日期时间FirstDateOfWeek(整数年,整数周)
{
var jan1=新日期时间(年,1,1);
var Daysofset=DayOfWeek.周四-1月1日DayOfWeek;
var First星期四=1月1日。增加天数(Daysofset);
var cal=CultureInfo.CurrentCulture.Calendar;
var firstWeek=cal.GetWeekOfYear(第一个星期四,CalendarWeekRule.FirstFourDayWeek,DayOfWeek.Monday);
var weekNum=一年一周;
if(firstWeek=DayOfWeek.Monday&&day model.Project.Name)
@DisplayNameFor(model=>model.Consultants.Name)
@DisplayNameFor(model=>model.TotalHours)
@DisplayNameFor(model=>model.TimeType)
@DisplayNameFor(model=>model.OnSite)
@DisplayNameFor(model=>model.Description)
@DisplayNameFor(model=>model.Date)
@foreach(模型中的var项目)
{
@DisplayFor(modelItem=>item.Project.Name)
@DisplayFor(modeleItem=>item.Consultants.Name)
@DisplayFor(modelItem=>item.TotalHours)
@DisplayFor(modelItem=>item.TimeType)
@DisplayFor(modelItem=>item.OnSite)
@DisplayFor(modelItem=>item.Description)
@DisplayFor(modelItem=>item.Date)
@ActionLink(“编辑”,“编辑”,新的{id=item.id})|
@ActionLink(“删除”,“删除”,新的{id=item.id})
}

@ActionLink(“上一周”、“上一周”、“时间报告”)|
@ActionLink(“下周”、“下周末”、“时间报告”)

控制器:

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);
        }
使用系统;
使用系统数据;
使用System.Linq;
使用System.Web.Mvc;
使用报表系统模型;
使用ReportSystem.ViewModel;
命名空间ReportSystem.Controller
{
公共类TimeReportsController:控制器
{
私有只读ReportsDatabaseEntities _db=new ReportsDatabaseEntities();
公共行动结果索引()
{
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)会话[“Id”];
var timeReports=_db.timeReports.Where(s=>s.Date>=startTime&s.dates.ConsultantID==ConsultantID.ToList();
ViewBag.Date=startTime;
返回视图(时间报告);
}
上周公众行动结果()
{
var weekNr=WeekConverter.GetIso8601WeekOfYear(DateTime.Now);//该值保持在同一周内。。。
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)会话[“Id”];
var timeReports=_db.timeReports.Where(s=>s.Date>=startTime&s.dates.ConsultantID==ConsultantID.ToList();
ViewBag.Date=startTime;
返回视图(“索引”,时间报告);
}
公共行动结果NextWeek()
{
var weekNr=WeekConverter.GetIso8601WeekOfYear(DateTime.Now);//该值保持在同一周内。。。
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)会话[“Id”];
var timeReports=_db.timeReports.Where(s=>s.Date>=startTime&s.dates.ConsultantID==ConsultantID.ToList();
ViewBag.Date=startTime;
返回视图(“索引”,时间报告);
}
任何帮助都将不胜感激。

此ActionResult“NextWeek()”需要启动周参数,否则一周内始终相同(DateTime.Now)

使用参数i'm shure创建地图路线,但请查看此以构建地图根

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

查看此帮助以构建地图路线

假设初始视图呈现当前周的时间报告集合,并且您希望链接重定向到呈现下一周/前一周报告集合的视图,那么您需要一个具有标识周的参数的方法。处理
DateTime
property可能有问题,因此在本例中,我将使用
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);
}

该参数应该是什么样子的?在类似以下内容的视图中,
@Html.ActionLink(“上一周”、“上一周”、“时间报告”,new{WeekStart=@ViewBag.PreviousDate});
在模型中,
ActionResult PreviousWeek(DateTime WeekStart)
您已经在几个小时前提出了这个问题。请删除其中一个。
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 })
}
// 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);
}