C# 我想显示在用户输入的特定时间范围内可用的所有汽车
我制作了一个查询视图模型C# 我想显示在用户输入的特定时间范围内可用的所有汽车,c#,asp.net,asp.net-mvc,model-view-controller,C#,Asp.net,Asp.net Mvc,Model View Controller,我制作了一个查询视图模型 public class QueryVM { public List<CarVM> CarVMs { get; set; } 这是我的控制器 public ActionResult Searched(DateTime? Start, DateTime? End) { if (Start.HasValue) { ViewBag.Start = Start.Value.Date;
public class QueryVM
{
public List<CarVM> CarVMs { get; set; }
这是我的控制器
public ActionResult Searched(DateTime? Start, DateTime? End)
{
if (Start.HasValue)
{
ViewBag.Start = Start.Value.Date;
}
if (End.HasValue)
{
ViewBag.End = End.Value.Date;
}
QueryVM queryVM = new QueryVM();
var carList = db.Cars;
var bookingList = db.Bookings;
queryVM.CarVMs = new List<CarVM>();
foreach (var item in carList)
{
CarVM cvm = new CarVM();
cvm.CarID = item.CarID;
cvm.Make = item.Make;
cvm.Model = item.Model;
cvm.Colour = item.Colour;
queryVM.CarVMs.Add(cvm);
}
foreach (var item in bookingList)
{
CarVM bvm = new CarVM();
bvm.StartDate = item.StartDate;
bvm.EndDate = item.EndDate;
queryVM.CarVMs.Add(bvm);
}
return View(queryVM);
在这里,我想检查查看包中日期之间可用的车辆,
r.EndDate
和r.StartDate
是表中的当前预订日期。我想我遇到的问题是,我从db.booking
获取预订日期,从db.Cars
获取车辆信息,但当我运行它时,我得到null
或0
,但我得到了预订日期,这似乎有点混乱。一个CarVM应该代表一辆车,在这种情况下,我们可以假设它也有一个日期范围列表,当该车已经预订(不可用)时,但您正在做的是有一个CarVM,它是汽车详细信息,然后是一组其他CarVM,它们纯粹指定汽车预订的日期。让你的生活更简单,有一个类,有一个开始日期和结束日期的日期对-让我们称之为DateRange,有一个CarVM
List<DateRange> BookedDates = new List<DateRange>();
“没有任何已预订日期的车辆与用户想要的车辆日期重叠”
公共预订重叠(DateTime qStart,DateTime qEnd){//查询的日期范围仅在该日期范围之后开始时是安全的,如果(qStartStartDate){qEnd=qEnd.Date;}否则{}//范围结束或在此范围开始之前结束//其他任何内容都是重叠返回!(qStart>EndDate&&qEnd
作为回报,它说不能将bool类型转换为sandstrom.models.Booking以及我应该如何在控制器中访问它对不起,我试图理解我是MVC新手。对不起,我的手机自动更正bool to book inpublic book Overlaps
-你似乎已经猜到它应该是预订的,但它应该是boolI已经给出了在视图中使用它的代码(一个示例),我的大部分回答都是为了解决控制器在将预订从db中取出并生成新的carVM(当我说它应该是现有carVM上的新日期范围时)时所犯的错误,所以应该很明显在控制器中替换什么?(提示:第二个循环)
@{
if (Model != null && ViewBag.Start != null && ViewBag.End != null)
{
foreach (var item in Model.CarVMs.Where(r => ViewBag.Start < r.EndDate && ViewBag.End > r.StartDate))
{
<td>
@Html.DisplayFor(modelItem => item.CarID)
</td>
<td>
@Html.DisplayFor(modelItem => item.Make)
</td>
List<DateRange> BookedDates = new List<DateRange>();
class DateRange{
public DateTime StartDate{get;set;}
public DateTime EndDate{get;set;}
public bool Overlaps(DateTime qStart, DateTime qEnd){
//a queried date range is only safe if it starts after this
//range ends or it ends before this range starts.
//anything else is an overlap
return !(qStart > EndDate || qEnd < StartDate);
}
}
carVMs.Where(c => !c.BookedDates.Any(dr => dr.Overlaps(userChosenStartDate, userChosenEndDate)));