如何在ASP MVC中的日期之间进行过滤

时间:2017-08-10 10:58:51

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

我正在尝试在ASP MVC中的Dates之间创建一个过滤器,但我总是得到这个错误:

  

无法将null转换为'System.DateTime',因为它是不可为空的   值类型

这就是我写的视图(〜/ Home / Index.cshtml):

@{
    var fromDate = (DateTime)ViewBag.fromDate;
    var toDate = (DateTime)ViewBag.toDate;
}

@using (Html.BeginForm("ProjectReport", "Home", FormMethod.Get))
{
    <div>From Date: @Html.TextBox("fromDate", string.Format("{0:dd MMM yyy}", fromDate), new { @class = "DatePicker" })</div>
    <div>To Date: @Html.TextBox("toDate", string.Format("{0:dd MMM yyy}", fromDate), new { @class = "DatePicker" })</div>
    <input type="submit" value="Search" />
}

<script type="text/javascript">
  $(document).ready(function () {
    $(".DatePicker").datepicker({
      dateFormat: 'dd M yy',
      changeMonth: true,
      changeYear: true,
     });
  });
</script>

和控制器:

public ActionResult ProjectReport(DateTime? fromDate, DateTime? toDate)             
{
    if (!fromDate.HasValue) 
        fromDate = DateTime.Now.Date;            
    if (!toDate.HasValue) 
        toDate = fromDate.GetValueOrDefault(DateTime.Now.Date).Date.AddDays(1);               
    if (toDate < fromDate) 
        toDate = fromDate.GetValueOrDefault(DateTime.Now.Date).Date.AddDays(1);            

    ViewBag.fromDate = fromDate;            
    ViewBag.toDate = toDate;            

    var voitures = db.Voitures
              .Where(c => c.ConstructionDate >= fromDate && c.ConstructionDate < toDate)
              .ToList();
    return View(voitures);        
}

我在控制台发出警告:

  

严重性代码说明项目文件行抑制状态警告CS0472
  表达式的结果始终为“true”,因为值为   类型'decimal'永远不会等于'decimal'类型的'null'   CarManagement
  C:\ Users ... \ CarManagement \ CarManagement \ Controllers \ HomeCo ntroller.cs 73 Activ e

控制器:

public class HomeController : Controller 
{ 
    private CarManagementContext db = new CarManagementContext(); 
    public ActionResult Index(string SortOrder, string SelectedMarque, string SelectedModele, string SelectedDate, string SelectedPrice) 
    { 
        { 
            ViewBag.Marque = String.IsNullOrEmpty(SortOrder) ? "Marque_desc" : ""; 
    .../...

4 个答案:

答案 0 :(得分:2)

在您的控制器中,您可以向DateTime?添加可选的ViewBag个对象。而是试图交出价值,而不是像这样交替选择:

ViewBag.fromDate = fromDate.Value;

如果仍有异常,则应将其抛入控制器内,告知您必须正确设置日期变量。

答案 1 :(得分:1)

ViewBag数据在控制器中为空,因为您没有创建它。

您需要在渲染视图的控制器中创建这些值。

public ActionResult Index(.../...

    ViewBag.fromDate = somedate;
    ViewBag.toDate = somedate;

您正在获取fromDate和toDate的值以用于您的日期,并且您将它们初始化为null - 这些ViewBag变量不存在。

@{
    var fromDate = (DateTime)ViewBag.fromDate;
    var toDate = (DateTime)ViewBag.toDate;
}

您还将DateTimes作为可选参数传递 - 因此您需要将它们检查为null:

public ActionResult ProjectReport(DateTime? fromDate, DateTime? toDate)
{
    if(fromDate == null)
        var fromDate = new DateTime();
    if (!fromDate.HasValue) fromDate = DateTime.Now.Date;
    if(fromDate == null)
        var fromDate = new DateTime();
    if (!toDate.HasValue) toDate = .../...

在尝试在视图中访问它们之前,请确保已在后面的代码中初始化了DateTime值。

答案 2 :(得分:0)

我猜这种情况正在发生,因为您正试图在视图中将null转换为日期时间。你可以这样做是检查空数据的视图:

@{
    Datetime? fromDate = ViewBag.fromDate != null ? (DateTime?)ViewBag.fromDate : null;
    Datetime? toDate = ViewBag.toDate != null ? (DateTime?)ViewBag.toDate : null;
}

在控制器中,请为ViewBag元素指定值:

ViewBag.fromDate = fromDate;
ViewBag.toDate = toDate;

答案 3 :(得分:0)

变化:

@{
    var fromDate = (DateTime)ViewBag.fromDate;
    var toDate = (DateTime)ViewBag.toDate;
}

为:

@{
    var fromDate = ViewBag.fromDate as DateTime?;
    var toDate = ViewBag.toDate as DateTime?;
}

并改变:

<div>From Date: @Html.TextBox("fromDate", string.Format("{0:dd MMM yyy}", fromDate), new { @class = "DatePicker" })</div>
<div>To Date: @Html.TextBox("toDate", string.Format("{0:dd MMM yyy}", fromDate), new { @class = "DatePicker" })</div>

为:

<div>From Date: @Html.TextBox("fromDate", fromDate == null ? "" : string.Format("{0:dd MMM yyy}", fromDate.Value), new { @class = "DatePicker" })</div>
<div>To Date: @Html.TextBox("toDate", toDate == null ? "" : string.Format("{0:dd MMM yyy}", toDate.Value), new { @class = "DatePicker" })</div>

第一个更改意味着视图会将DateTime以外的任何内容视为空。

第二个更改将确保string.Format如果传递null,则不会抛出异常(我假设您希望在日期为null时呈现空字符串,但如果不符合您的要求,您可以自行更改)。 您的toDate文本框也引用了fromDate(我认为这是一个错字)所以我也修复了它。