在ASP.NET MVC [不是静态]中声明全局Razor页面变量



我有一个configurationservice类,该类被注入" _viewimports":

@inject IConfigurationService ConfigurationService

我在每个视图页面中访问它,如下所示:

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

这有效,但是我必须在每个页面中复制并粘贴代码。我尝试在_Layout.cshtml中编写代码,但它不起作用。静态var也无法使用,因为值不是静态的 - 对于每个请求,我都会获得当前的用户配置并注入页面。而且,对于所有需要currencySymbol变量值的页面,我需要粘贴代码,而我不想这样做。

我的问题是:如何将变量声明,例如_Layout.cshtml_ViewStart.cshtml或所有其他视图,所有剃须刀视图页面都可以访问,例如继承。这些变量必须包含配置服务值。

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

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

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

最新更新