【问题标题】:I want to display all the cars which are available in a certain time frame entered by the user我想显示用户输入的特定时间范围内可用的所有汽车
【发布时间】:2020-04-06 06:26:17
【问题描述】:

我已经做了一个查询视图模型

 public class QueryVM
{

    public List<CarVM> CarVMs { get; set; }

这包含

 public class CarVM
{
    public int CarID { get; set; }
    public int CustomerID { get; set; }

    public string Make { get; set; }

    public string Model { get; set; }

    public string RegNumber { get; set; }
    public string Colour { get; set; }
    public DateTime StartDate { get; set; } //From Booking Table
    public DateTime EndDate { get; set; } //From Booking Table

这是我的控制器

 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);

首先我检查值是否有数据,然后将它们存储在视图包中,然后使用来自 db.Cars 的信息填充查询视图模型,然后从预订表中填充 start dateend date 并返回视图模型

这是我在视图中的代码

 @{
    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>

在这里,我想查看查看包中日期之间可用的汽车,r.EndDater.StartDate 是表中的当前预订日期。我认为我遇到的问题是我从db.booking 获取预订日期,从db.Cars 获取汽车信息但是当我运行它时我得到null0 但我得到了预订日期

【问题讨论】:

    标签: c# asp.net asp.net-mvc model-view-controller


    【解决方案1】:

    这似乎搞砸了。 CarVM 应该代表一辆车,在这种情况下,人们会假设它还有一个日期范围列表,当该车已经预订(不可用)时,但您正在做的是拥有一个 CarVM,它是汽车的详细信息和然后是一堆其他 CarVM,它们纯粹指定汽车的预订日期。让你的生活更简单,有一个有一对开始日期和结束日期的类 - 我们称之为 DateRange,让 CarVM 有一个;

    List<DateRange> BookedDates = new List<DateRange>();
    

    从您的数据库中填写此内容,而不是创建多个带有预订日期的新 CarVM,然后您将拥有汽车及其预订的一致单一数据模型

    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);
      }
    }
    

    这意味着您可以获取 CarVM 列表并找出哪些可用:

    carVMs.Where(c => !c.BookedDates.Any(dr => dr.Overlaps(userChosenStartDate, userChosenEndDate)));
    

    “没有任何已预订日期的汽车与用户想要汽车的日期重叠”

    【讨论】:

    • public Booking Overlaps(DateTime qStart, DateTime qEnd) { //a queried date range is only safe if it starts after this if (qStart &lt; EndDate){ qStart = qStart.Date; } else{ } if (qEnd &gt; StartDate){ qEnd = qEnd.Date; } else{ } //range ends or it ends before this range starts. //anything else is an overlap return !(qStart &gt; EndDate &amp;&amp; qEnd &lt; StartDate);
    • 在返回中说不能将 bool 类型转换为 sandstrom.models.Booking
    • 我该如何在我的控制器中访问它对不起我试图理解我是 MVC 的新手
    • 抱歉,我的手机自动更正 bool 以在 public book Overlaps 中预订 - 你似乎猜到应该是 Booking,但应该是 bool
    • 我已经给出了在视图中使用它的(一个示例)代码,我的大部分答案旨在解决控制器在从数据库中提取预订并制作新的 carVM 时所犯的错误(当我说它应该是现有 carVM 上的新 DateRange 时)所以在控制器中替换什么应该是相当明显的? (提示:第二个循环)
    猜你喜欢
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    相关资源
    最近更新 更多