使用ASP.NET Core 2 MVC访问Javascript中的配置设置

Jam*_*ndy 3 asp.net razor asp.net-core-mvc asp.net-core

我目前正在使用ASP.NET Core 2和Bootstrap构建一个简单的网站。该站点将部署到暂存和生产环境中,因此我希望能够使用可以在Azure中设置的配置键/值对来配置某些设置。我也希望这些值可以在Javascript中使用。

感谢这篇有用的博客文章,我已经找到了如何创建AppSettings类并填充它的方法。这篇文章还介绍了使用依赖注入从RazorPage模型访问AppSettings。

我的appsettings.json文件

{
    "AppSettings": {
        "TestProperty": "Test_Property"
    },
    "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
            "Default": "Warning"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

自动绑定我在Startup.cs中的AppSettings类

services.Configure<AppSettings>(Configuration.GetSection(nameOf(AppSettings)));
Run Code Online (Sandbox Code Playgroud)

通过依赖项注入访问设置:

public class HomeModel : PageModel
{
    private readonly AppSettings _appSettings;

    public string TestProperty {get; set;}

    public HomeModel(IOptions<AppSettings> appSettings)
    {
        _appSettings = appSettings.Value;
    }

    public IActionResult Index()
    {
        TestProperty = _appSettings.TestProperty;

        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在要在javascript中使用此属性的页面上,执行以下操作以创建具有以下设置的javascript属性:

<script type="text/javascript">
  var testProperty = '@Model.TestProperty';
</script>
Run Code Online (Sandbox Code Playgroud)

这可以工作,但理想情况下,我不需要配置每个页面以使用此依赖项注入并TestProperty在每个页面上公开我的代码。我希望能够将上面的代码放到其中,以_Layout.cshtml呈现每个页面的正文(或其他适当位置)的方式,这样我可以创建一个javascript变量供每个页面使用。

我曾考虑过使用BaseViewModel继承所有页面的模型,但是对此进行试验并没有带来任何有用的结果(只是一个例外)。

您将如何通过只能配置一次的配置设置创建javascript属性?

Jam*_*ndy 5

我想出了一些可以满足我需要的方式,但是非常有兴趣听到其他建议,我的方式可能远非最佳。

我偶然发现了该博客文章,其中谈到了MVC6关键字@inject。使用它可以将依赖项注入到Razor视图中。

使用此方法,我在_Layout.cshtml文件顶部添加了以下内容:

@inject IAppSettings AppSettings; 
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用以下视图在此视图中引用AppSettings的属性:

<script type="text/javascript">
        var testProperty = '@AppSettings.TestProperty';
    </script>
Run Code Online (Sandbox Code Playgroud)

然后,我编辑我的Startup.cs类以注册IAppSettings并创建一个AppSettings工厂,该工厂读取appsettings.json文件并在需要时创建一个新的AppSettings类:

services.AddSingleton<IAppSettings, AppSettings>(e => Configuration.GetSection(nameof(AppSettings)).Get<AppSettings>());
Run Code Online (Sandbox Code Playgroud)

这很有效,我可以testProperty在应用程序中的任何地方访问我的javascript ,但是我很好奇是否有人对如何进行不同的处理有其他想法(也许使用BaseViewModel)吗?

更新: 根据要求,以下是有关我的实施的更多信息:

我的IAppSettingsService接口:

public interface IAppSettingsService
    {
        string AzureStorageAccountName { get; }
        string AzureStorageAccountKey { get; }
    }
Run Code Online (Sandbox Code Playgroud)

我的AppSettingsService实现:

public class AppSettingsService : IAppSettingsService
{
    public string AzureStorageAccountName { get; set; }
    public string AzureStorageAccountKey { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

AppSettings.json:

{
    "AppSettings": {
        "AzureStorageAccountName": "XXXXXXXXXX",
        "AzureStorageAccountKey": "XXXXXXXXXX"
    },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,在Azure门户中,我可以随时使用AppSettings:AzureStorageAccountName“应用程序设置”部分中的值并将其设置为所需信息来更改这些值。