我有一个注入(inject)“_ViewImports”的 ConfigurationService 类

@inject IConfigurationService ConfigurationService

并在每个 View 页面访问它,如下所示:
@{
    // Configurations
    var configuration = await ConfigurationService.GetGeneralConfiguration();
    var currencySymbol = configuration.Currency.Symbol;
}

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

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

对不起我的英语不好。

最佳答案

与其创建变量,不如注入(inject)一个可以根据需要生成所需值的服务。例如:

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)新服务:
@inject ILocalisationService LocalisationService

并在您的 View 中使用它:
The currency symbol is @LocalisationService.CurrencySymbol

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

关于c# - 在 ASP.NET MVC 中声明全局 Razor Page 变量 [非静态],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47857068/

10-12 00:39
查看更多