【问题标题】:Calling a shared code from Page method and WebApi Controller with Razor Pages使用 Razor 页面从 Page 方法和 WebApi 控制器调用共享代码
【发布时间】:2017-08-29 02:17:04
【问题描述】:

我正在使用带有核心 2.0 的新 Razor 页面,我试图通过将 linq 和 db 初始化放入 App_code 文件夹中的实用程序类来查看是否可以共享查询代码,但我遇到了问题使这个类工作。

基本上我使用 linq 查询数据库,但我还有另一个 asp-page-handler 可以创建 PDF。

这是我的页面

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

所以问题是智能感知没有检测到 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 上得到一个空异常,但不知道为什么会这样。

【问题讨论】:

  • 因为当你将其更改为静态方法时,_context 并没有在同一个方法中定义。您在 Utility 实例的构造函数中声明了它。您之前的尝试 Utility.GetSelectionData() 将调用作为静态方法进行,但您将 .GetSelectionData 编写为实例方法。

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


【解决方案1】:

问题是当你将函数更改为static时,现在调用它并没有初始化类并且没有调用构造函数public Utility(CrewLogContext context),所以_context字段没有分配给任何东西并保持@ 987654324@.

解决此问题的一种方法是删除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 ;
   }

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

【讨论】:

    猜你喜欢
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 2014-08-11
    • 2020-05-04
    • 1970-01-01
    • 2019-12-09
    相关资源
    最近更新 更多