【发布时间】:2019-10-14 04:42:33
【问题描述】:
我需要使用带有 TempData 的实体框架核心在两个日期(从日期,到日期)之间进行搜索,但是,到目前为止,我正在解决一些问题。
这是模型的代码
[DataType(DataType.DateTime)]
[DisplayName("Activity Log Date Time")]
public DateTime ActivityLogDateTime { get; set; }
和控制器代码这个
[HttpPost(Name = "Index")]
public async Task<IActionResult> Index(int? page, DateTime fromDate, DateTime toDate, string operation, string userName, string pageName, string number)
{
//Viewbag information for view
ViewBag.fromDate = fromDate;
ViewBag.toDate = toDate;
ViewBag.operation = operation;
ViewBag.userName = userName;
ViewBag.pageName = pageName;
//To store search data
TempData["fromDate"] = fromDate;
TempData["toDate"] = toDate;
TempData["operation"] = operation;
TempData["userName"] = userName;
TempData["pageName"] = pageName;
//Check if number == null then put default value 10
if (number == null)
{
number = "10";
}
//Record Activity Logs
activity.PageId = 1;
var name = await db.Pages.FindAsync(activity.PageId);
activity.Username = User.Identity.Name;
activity.Operation = "Search";
activity.Description = "Username: (" + User.Identity.Name + ") search in page number " + activity.PageId.ToString() + " (" + name.PageName + ")";
activity.TechnicalDescription = "Username = " + User.Identity.Name + ", PageId = " + activity.PageId.ToString() + ", fromDate = " + fromDate
+ ", toDate = " + toDate + ", operation = " + operation + ", username = " + userName + ", pagename = " + pageName;
activity.ActivityLogDateTime = DateTime.Now;
//End Record Activity Logs
db.ActivityLogs.Add(activity);
await db.SaveChangesAsync();
if (fromDate.Year.ToString().Equals("1") && toDate.Year.ToString().Equals("1") && operation == null && userName == null && pageName == null)
{
return View(await db.ActivityLogs.Include(x => x.Pages).OrderByDescending(x => x.ActivityLogDateTime).ToPagedListAsync(page ?? 1, 10));
}
else
{
return View(await db.ActivityLogs.Include(x => x.Pages).OrderByDescending(x => x.ActivityLogDateTime)
.Where(x => x.ActivityLogDateTime >= fromDate && x.ActivityLogDateTime <= toDate && string.IsNullOrEmpty(operation) ? true : x.Operation.Contains(operation)
&& string.IsNullOrEmpty(userName) ? true : x.Username.Contains(userName) && string.IsNullOrEmpty(pageName) ? true : x.Pages.PageName.Contains(pageName))
.ToPagedListAsync(page ?? 1, int.Parse(number)));
}
}
public FileResult ExportExcel()
{
DataTable dt = new DataTable("Grid");
dt.Columns.AddRange(new DataColumn[7] { new DataColumn("Activity Logs Id"),
new DataColumn("Date and Time"),
new DataColumn("Username"),
new DataColumn("Operation"),
new DataColumn("Description"),
new DataColumn("Technical Description"),
new DataColumn("PageName")});
var report = new List<ActivityLogs>();
if (Convert.ToDateTime(TempData["fromDate"].ToString()).Year.ToString().Equals("1") && Convert.ToDateTime(TempData["toDate"]).Year.ToString().Equals("1")
&& TempData["operation"].ToString() == null && TempData["userName"].ToString() == null && TempData["pageName"].ToString() == null)
{
report = db.ActivityLogs.Include(x => x.Pages).OrderByDescending(x => x.ActivityLogDateTime).ToList();
}
else
{
report = db.ActivityLogs.Include(x => x.Pages).OrderByDescending(x => x.ActivityLogDateTime)
.Where(x => x.ActivityLogDateTime >= Convert.ToDateTime(TempData["fromDate"].ToString()) && x.ActivityLogDateTime <= Convert.ToDateTime(TempData["toDate"].ToString())
&& string.IsNullOrEmpty(TempData["operation"].ToString()) ? true : x.Operation.Contains(TempData["operation"].ToString())
&& string.IsNullOrEmpty(TempData["userName"].ToString()) ? true : x.Username.Contains(TempData["userName"].ToString())
&& string.IsNullOrEmpty(TempData["pageName"].ToString()) ? true : x.Pages.PageName.Contains(TempData["pageName"].ToString())).ToList();
}
foreach (var item in report)
{
dt.Rows.Add(item.ActivityLogId, item.ActivityLogDateTime, item.Username, item.Operation, item.Description, item.TechnicalDescription,
item.Pages.PageName);
}
using (XLWorkbook wb = new XLWorkbook())
{
wb.Worksheets.Add(dt);
using (MemoryStream stream = new MemoryStream())
{
wb.SaveAs(stream);
return File(stream.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "ActivityLogs " + DateTime.Now +".xlsx");
}
}
}
当我需要导出 excel 文件时,我发现了这个错误:
NullReferenceException:对象引用未设置为对象的实例。
InvalidOperationException:尝试评估 LINQ 查询参数表达式时引发异常。要在覆盖 DbContext.OnConfiguring 时显示附加信息,请调用 EnableSensitiveDataLogging()。
我的代码是这样工作的:
- 用户搜索放搜索条件(从日期,到日期,...)
- 然后用户点击搜索按钮
- 之后他们可以导出他搜索的搜索数据,因为我将搜索数据保存在 TempData[] 字典中,并将这个 TempData[] 字典传递给 ExportExcel FileResult。
我该如何解决这个问题?
【问题讨论】:
-
你确定这个错误是因为
TempData吗? -
@mmushtaq ,我一步一步调试程序,我确信这个错误来自 TempData,因为搜索部分工作正常,它与导出 excel 文件的代码相同
-
ToString()如果找到null则抛出Null Reference Exception,因此TempData["key"].ToString() == null也可能导致Null Reference错误。首先检查TempData["operation"] != null之类的空值,然后应用ToString()转换.. -
@mmushtaq,DateTime 不能为空,它带有默认值 01/01/0001 ...
标签: c# datetime asp.net-core entity-framework-core