2017-08-29 59 views
1

我正在使用新的Razor頁與核心2.0,我試圖看看我是否可以共享查詢代碼通過將linq和db初始化到一個App_code文件夾中的實用程序類,但是我在使這個類正常工作時遇到了問題。從頁方法和WebApi控制器與Razor頁面調用共享代碼

基本上我用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; 
} 

確定。所以這工作正常。我也有另一個按鈕,它調用一個基本上查詢相同數據並生成PDF的webApi控制器。

我想創建一個工具類,並從頁面或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空例外,不知道這是爲什麼。

+0

因爲當您將其更改爲靜態方法時,'_context'未在同一方法中定義。您在Utility實例的構造函數中聲明瞭它。您之前的嘗試'Utility.GetSelectionData()'將該調用作爲靜態方法,但是您將'.GetSelectionData'作爲實例方法編寫。 – Jasen

回答

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

以上解決方案可能看起來更容易,但使用正確的注入可能更好,就像它在控制器中的工作方式一樣。