【问题标题】:Declare global Razor Page variables in ASP.NET MVC [NOT Static]在 ASP.NET MVC [非静态] 中声明全局 Razor 页面变量
【发布时间】:2017-12-17 16:22:37
【问题描述】:

我有一个在“_ViewImports”中注入的 ConfigurationService 类

@inject IConfigurationService ConfigurationService

并像下面这样访问每个视图页面:

@{
    // Configurations
    var configuration = await ConfigurationService.GetGeneralConfiguration();
    var currencySymbol = configuration.Currency.Symbol;
}

这可行,但我必须复制并粘贴每个页面的代码。我试图在_Layout.cshtml 中编写代码,但不起作用。静态变量也不起作用,因为值不是静态的,每个请求我都会获取当前用户配置并注入页面。所有需要currencySymbol 变量值的页面我都需要粘贴代码,我不想要这个。

我的问题是:我如何声明变量,例如 _Layout.cshtml_ViewStart.cshtml 或其他,所有 razor 视图页面都可以访问,例如继承。此变量必须包含 ConfigurationService 值。

对不起我的英语。

【问题讨论】:

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


    【解决方案1】:

    您最好注入一个服务,该服务将根据需要生成您需要的值,而不是创建变量。例如:

    public interface ILocalisationService
    {
        string CurrencySymbol { get; }
    }
    
    public class LocalisationService : ILocalisationService
    {
        private IConfigurationService _configurationService;
        private string _currencySymbol;
    
        public LocalisationService(IConfigurationService configurationService)
        {
            _configurationService = configurationService;
        }
    
        public string CurrencySymbol => string.IsNullOrEmpty(_currencySymbol)
            ? _currencySymbol = _configurationService.GetValue("£")
            : _currencySymbol;
    }
    

    现在注入新服务:

    @inject ILocalisationService LocalisationService
    

    并在你的视图中使用它:

    The currency symbol is @LocalisationService.CurrencySymbol
    

    这样做的好处是,当您的视图不使用其中一个值时,它不需要进行计算,如果需要很长时间,这一点尤其重要。

    【讨论】:

    • 您错过了在 Startup 上将新服务添加到 ConfigureServices,如下所示:services.AddSingleton<ILocalizationService, LocalizationService>();
    • @Max 好吧,是的,但是由于 OP 已经在做 DI,他们会知道怎么做。
    • 当然可以,但是新用户可能不知道并且无法让您的代码正常工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多