我正在尝试在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" : "";
.../...
答案 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
(我认为这是一个错字)所以我也修复了它。