使用Razor Pages从Page方法和WebApi Controller调用共享代码

时间:2017-08-29 02:17:05

标签: c# linq razor asp.net-core-mvc

我正在使用带有核心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异常,并且不确定为什么会这样。

1 个答案:

答案 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 ;
   }

上述解决方案可能看起来更简单,但使用正确的注射可能更好,就像它在控制器中的工作方式一样。