Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Razor 深入了解从基本控制器类继承_Razor_Asp.net Core_Entity Framework 6_Asp.net Core Mvc - Fatal编程技术网

Razor 深入了解从基本控制器类继承

Razor 深入了解从基本控制器类继承,razor,asp.net-core,entity-framework-6,asp.net-core-mvc,Razor,Asp.net Core,Entity Framework 6,Asp.net Core Mvc,我正在使用.netcore2.1、实体框架和Razor页面创建一个游戏管理系统 我在Microsoft.AspNetCore.Mvc命名空间中有一个控制器,它连接到第三方API并从中检索数据 控制器有许多不同的方法返回不同的内容,但它们都共享以下代码: public static GameSystemManager.LoginInfo gamerManagerLogin = new GameSystemManager.LoginInfo() { UserKey =

我正在使用.netcore2.1、实体框架和Razor页面创建一个游戏管理系统

我在Microsoft.AspNetCore.Mvc命名空间中有一个控制器,它连接到第三方API并从中检索数据

控制器有许多不同的方法返回不同的内容,但它们都共享以下代码:

    public static GameSystemManager.LoginInfo gamerManagerLogin = new GameSystemManager.LoginInfo()
    {
        UserKey = "myAPIkey",
        Password = "xyzxyz"
    };

    public static GameSystemManager.GamerLister gamerLists = new GameSystemManager.GamerLister
    {
        MaxNumberResults = 15,
        PageNumber = 0
    };
因此,一个控制器方法可能如下所示:

    public IActionResult GetAllGames(Guid Id)
    {

        public static GameSystemManager.LoginInfo gamerManagerLogin = new GameSystemManager.LoginInfo()
        {
            UserKey = "myAPIkey",
            Password = "xyzxyz"
        };

        public static GameSystemManager.GamerLister gamerLists = new GameSystemManager.GamerLister
        {
            MaxNumberResults = 15,
            PageNumber = 0
        };

        response = GameSystemManager.ListGames(gamerManagerLogin, gamerLists, Id);

        return View(response.Results);
    }
由于多个控制器和方法使用相同的代码,因此我决定创建一个基本控制器,并将该代码放入其中,然后让其他控制器从中继承

这是我的BaseController:

   public class BaseController : Controller
   {

        public static GameSystemManager.LoginInfo gamerManagerLogin = new GameSystemManager.LoginInfo()
        {
            UserKey = "myAPIkey",
            Password = "xyzxyz"
        };

        public static GameSystemManager.GamerLister gamerLists = new GameSystemManager.GamerLister
        {
            MaxNumberResults = 15,
            PageNumber = 0
        };

    }
public class GameListController : Controller
{
    private readonly GamerManagerConfig _gamerManagerConfig;

    public GameListController(IOptions<GamerManagerConfig> gamerManagerConfig)
    {
        _gamerManagerConfig = gamerManagerConfig.Value;
    }

    public IActionResult GetAllGames(Guid id, page = 1, maxResults = 15)
    {
        var gamerManagerLogin = new GameSystemManager.LoginInfo
        {
            UserKey = _gamerManagerConfig.UserKey,
            Password = _gamerManagerConfig.Password
        };

        var gamerLists = new GameSystemManager.GamerLister
        {
            MaxNumberResults = maxResults,
            PageNumber = page
        };

        var response = GameSystemManager.ListGames(gamerManagerLogin, gamerLists, id);

        return View(response.Results);
    }
}
下面是我如何使用它:

public class GameListController : BaseController
{

    public IActionResult GetAllGames(Guid Id)
    {

        response = GameSystemManager.ListGames(gamerManagerLogin, gamerLists, Id);

        return View(response.Results);
    }

}
以下是我的appsettings.json:

  "GamerManager": {
    "UserKey": "myAPIkey",
    "Password": "xyzxyz"
  },
这是我的GamerManager配置类:

public class GamerManagerConfig
{
    readonly string UserKey = "myAPIkey";
    readonly string Password = "xyzxyz";
}
但是,它不起作用。我刚从API中得到一个超时错误。它只在控制器方法中直接包含代码时才起作用,就像上面的示例一样

我认为这可能与初始化有关。可能需要在方法中直接初始化它?我不确定

任何洞察都将不胜感激


谢谢

请尝试以下代码。我怀疑您的静态方法链接到BaseController

静态方法基本上是一种从面向对象后退的方法 概念。因此,它们在继承方面不是很灵活 层次结构,不可能直接做这样的事情


或者,您可以在BaseController中创建构造函数。当您从GameListController调用基本构造函数时,它可以使用正确的值初始化GameSystemManager对象。然后可以从基类访问属性

请尝试以下代码。我怀疑您的静态方法链接到BaseController

静态方法基本上是一种从面向对象后退的方法 概念。因此,它们在继承方面不是很灵活 层次结构,不可能直接做这样的事情


或者,您可以在BaseController中创建构造函数。当您从GameListController调用基本构造函数时,它可以使用正确的值初始化GameSystemManager对象。然后可以从基类访问属性

您的登录信息应该在外部配置(用户机密、环境变量、Azure密钥库等)中,然后您应该将其注入控制器。最大结果和页码也应该在外部配置中,或者作为操作的参数提供(如果您希望能够通过请求对其进行自定义)

创建一个类,如:

public class GamerManagerConfig
{
    UserKey = "myAPIkey",
    Password = "xyzxyz"
}
将您的配置绑定到Startup.cs中:

services.Configure<GamerManagerConfig>(Configuration.GetSection("GamerManager"));
services.Configure(Configuration.GetSection(“GamerManager”);
然后,在控制器中:

   public class BaseController : Controller
   {

        public static GameSystemManager.LoginInfo gamerManagerLogin = new GameSystemManager.LoginInfo()
        {
            UserKey = "myAPIkey",
            Password = "xyzxyz"
        };

        public static GameSystemManager.GamerLister gamerLists = new GameSystemManager.GamerLister
        {
            MaxNumberResults = 15,
            PageNumber = 0
        };

    }
public class GameListController : Controller
{
    private readonly GamerManagerConfig _gamerManagerConfig;

    public GameListController(IOptions<GamerManagerConfig> gamerManagerConfig)
    {
        _gamerManagerConfig = gamerManagerConfig.Value;
    }

    public IActionResult GetAllGames(Guid id, page = 1, maxResults = 15)
    {
        var gamerManagerLogin = new GameSystemManager.LoginInfo
        {
            UserKey = _gamerManagerConfig.UserKey,
            Password = _gamerManagerConfig.Password
        };

        var gamerLists = new GameSystemManager.GamerLister
        {
            MaxNumberResults = maxResults,
            PageNumber = page
        };

        var response = GameSystemManager.ListGames(gamerManagerLogin, gamerLists, id);

        return View(response.Results);
    }
}
公共类GameListController:控制器
{
私有只读GamerManager配置_GamerManager配置;
公共GameListController(IOptions GamerManager配置)
{
_GamerManager配置=GamerManager配置.Value;
}
public IActionResult GetAllGames(Guid id,第1页,maxResults=15)
{
var gamerManagerLogin=new GameSystemManager.LoginInfo
{
UserKey=\u gamerManagerConfig.UserKey,
Password=\u gamerManagerConfig.Password
};
var gamerLists=new GameSystemManager.GamerLister
{
MaxNumberResults=maxResults,
页码=第页
};
var response=GameSystemManager.ListGames(GamerManager登录,GamerList,id);
返回视图(response.Results);
}
}

您的登录信息应该在外部配置中(用户机密、环境变量、Azure密钥库等),然后您应该将其注入控制器。最大结果和页码也应该在外部配置中,或者作为操作的参数提供(如果您希望能够通过请求对其进行自定义)

创建一个类,如:

public class GamerManagerConfig
{
    UserKey = "myAPIkey",
    Password = "xyzxyz"
}
将您的配置绑定到Startup.cs中:

services.Configure<GamerManagerConfig>(Configuration.GetSection("GamerManager"));
services.Configure(Configuration.GetSection(“GamerManager”);
然后,在控制器中:

   public class BaseController : Controller
   {

        public static GameSystemManager.LoginInfo gamerManagerLogin = new GameSystemManager.LoginInfo()
        {
            UserKey = "myAPIkey",
            Password = "xyzxyz"
        };

        public static GameSystemManager.GamerLister gamerLists = new GameSystemManager.GamerLister
        {
            MaxNumberResults = 15,
            PageNumber = 0
        };

    }
public class GameListController : Controller
{
    private readonly GamerManagerConfig _gamerManagerConfig;

    public GameListController(IOptions<GamerManagerConfig> gamerManagerConfig)
    {
        _gamerManagerConfig = gamerManagerConfig.Value;
    }

    public IActionResult GetAllGames(Guid id, page = 1, maxResults = 15)
    {
        var gamerManagerLogin = new GameSystemManager.LoginInfo
        {
            UserKey = _gamerManagerConfig.UserKey,
            Password = _gamerManagerConfig.Password
        };

        var gamerLists = new GameSystemManager.GamerLister
        {
            MaxNumberResults = maxResults,
            PageNumber = page
        };

        var response = GameSystemManager.ListGames(gamerManagerLogin, gamerLists, id);

        return View(response.Results);
    }
}
公共类GameListController:控制器
{
私有只读GamerManager配置_GamerManager配置;
公共GameListController(IOptions GamerManager配置)
{
_GamerManager配置=GamerManager配置.Value;
}
public IActionResult GetAllGames(Guid id,第1页,maxResults=15)
{
var gamerManagerLogin=new GameSystemManager.LoginInfo
{
UserKey=\u gamerManagerConfig.UserKey,
Password=\u gamerManagerConfig.Password
};
var gamerLists=new GameSystemManager.GamerLister
{
MaxNumberResults=maxResults,
页码=第页
};
var response=GameSystemManager.ListGames(GamerManager登录,GamerList,id);
返回视图(response.Results);
}
}

发布不起作用的代码可能比发布起作用的代码更有帮助!谢谢我加了底座controller@Loofer我还添加了使用基本控制器的方式。您的登录信息应该在外部配置(用户机密、环境变量、Azure密钥库等)中,然后您应该将其注入控制器。包含页码和最大结果的静态也不应该是静态的。Max results也可能在您的配置中,而页码根本不应该在那里,而是应该来自请求。@ChrisPratt谢谢,但我只是从我的Razor页面中点击控制器。我该如何传递这些信息?再次感谢。也许发布不起作用的代码比发布不起作用的代码更有帮助!谢谢我加了底座controller@Loofer我还添加了使用基本控制器的方式。您的登录信息应该在外部配置(用户机密、环境变量、Azure密钥库等)中,然后您应该是injec