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属性?
我想出了一些可以满足我需要的方式,但是非常有兴趣听到其他建议,我的方式可能远非最佳。
我偶然发现了该博客文章,其中谈到了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“应用程序设置”部分中的值并将其设置为所需信息来更改这些值。
| 归档时间: |
|
| 查看次数: |
3650 次 |
| 最近记录: |