我正在使用带有核心2.0的新Razor页面,我试图通过将linq和db初始化放入App_code文件夹中的Utility类来查看是否可以共享查询代码但是我&#39 ;我有一个问题,让这个班上班。
基本上我用linq查询数据库但我还有另一个用于创建PDF的asp页面处理程序。
这是我的页面
public class IndexModel : PageModel
{
private readonly CrewLogContext _context;
//initialize db
public IndexModel(CrewLogContext context)
{
_context = context;
}
public IList<SelectionDailyReport> SelectionDailyReport { get; set; }
public DateSearchRange DateSearchRange { get; set; }
public async Task OnPostSelectionAsync(DateSearchRange DateSearchRange)
{
var result= await _context.TaskSelection.Where(x => x.WorkDate >= startDate && x.WorkDate <= endDate)
.Include(t => t.Zone).OrderBy(x => x.AssocId).ToListAsync();
SelectionDailyReport = result;
}
行。所以这很好。我还有另一个调用webApi控制器的按钮,它基本上可以查询相同的数据并生成PDF。
我想创建一个实用程序类并从页面或webapi控制器调用它的方法,所以我不必编写两次linq查询。
我创建了一个App_Folder并添加了一个.cs文件
在Utility.cS中
namespace WebCrewLog.App_Code
{
public class Utility
{
private CrewLogContext _context;
//initiate db connection
public Utility(CrewLogContext context)
{
_context = context;
}
public IList<SelectionDailyReport> GetSelectionData (DateSearchRange DateSearchRange)
{
var myList = _context.TaskSelection.Where(x => x.WorkDate >=DateSearchRange.StartDate && x.WorkDate <= DateSearchRange.EndDate)
.Include(t => t.Zone).OrderBy(x => x.AssocId).ToList();
return myList ;
}
然后从我的页面或我的webapi我想打电话
SelectionDailyReport = Utility.GetSelectionData(DateSearchRange);
所以问题是intellisense没有检测到GetSelectionData方法。所以我认为我应该将GetSelectionData方法设为静态。
所以更改实用程序类
public IList<SelectionDailyReport> GetSelectionData (DateSearchRange DateSearchRange)
{
var myList = _context.TaskSelection.Where(x => x.WorkDate >=DateSearchRange.StartDate && x.WorkDate <= DateSearchRange.EndDate)
.Include(t => t.Zone).OrderBy(x => x.AssocId).ToList();
....
public static IList<SelectionDailyReport> GetSelectionData (DateSearchRange DateSearchRange)
{
var myList = _context.TaskSelection.Where(x => x.WorkDate >=DateSearchRange.StartDate && x.WorkDate <= DateSearchRange.EndDate)
.Include(t => t.Zone).OrderBy(x => x.AssocId).ToList();
....
但是,当我这样做时,我在_context.TaskSelection上获得了一个null异常,并且不确定为什么会这样。
答案 0 :(得分:0)
问题是,当您将函数更改为static
时,现在调用它不会初始化类,并且不会调用构造函数public Utility(CrewLogContext context)
,因此_context
字段不会分配给任何内容并留下null
。
解决此问题的一种方法是删除static
并在构建对象并传递上下文后调用该函数。所以而不是:
SelectionDailyReport = Utility.GetSelectionData(DateSearchRange);
尝试类似:
Utility u = new Utility(myContext); //Change myContext to the name of your context
SelectionDailyReport = u.GetSelectionData(DateSearchRange);
如果您希望它为static
,那么您必须将其传递给上下文:
public static IList<SelectionDailyReport> GetSelectionData (DateSearchRange DateSearchRange, CrewLogContext context) {
var myList = context.TaskSelection.Where(x => x.WorkDate >=DateSearchRange.StartDate && x.WorkDate <= DateSearchRange.EndDate)
.Include(t => t.Zone).OrderBy(x => x.AssocId).ToList();
return myList ;
}
上述解决方案可能看起来更简单,但使用正确的注射可能更好,就像它在控制器中的工作方式一样。