如何编写可以在所有Razor视图中使用的函数?

如何编写可以在所有Razor视图中使用的函数?,razor,Razor,我正在尝试编写一个函数,可以从MVC5和Razor中的数据库中获取语言资源, 我希望它使用起来非常简单,例如,以下函数应该只获得一些文本: @T("ResourceType", "ResourceName") 我不想用这个只是函数名 我看到一些关于它的帖子提到了下面这一行,但仍然试图理解如何做到这一点 public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel> 公共抽象类

我正在尝试编写一个函数,可以从MVC5和Razor中的数据库中获取语言资源, 我希望它使用起来非常简单,例如,以下函数应该只获得一些文本:

@T("ResourceType", "ResourceName")
我不想用这个只是函数名

我看到一些关于它的帖子提到了下面这一行,但仍然试图理解如何做到这一点

public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel>
公共抽象类WebViewPage:System.Web.Mvc.WebViewPage
任何帮助都将不胜感激。
提前感谢。

受NopCommerce项目的启发,我终于找到了一种方法,请参见下面的代码

该代码可以在任何Razor(cshtml)视图中使用,如下所示:

<h1>@T("StringNameToGet")</h1>
  <system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="MyNameSpace.Web.Extensions.WebViewPage">
<namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Optimization"/>
    <add namespace="System.Web.Routing" />
    <add namespace="APE.Web" />
  </namespaces>
</pages>
@T(“StringNameToGet”)
另外,请注意pageBaseType需要使用正确的新名称空间进行更新, 这是Views文件夹中的web.config,不是主文件夹,应该如下所示:

<h1>@T("StringNameToGet")</h1>
  <system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="MyNameSpace.Web.Extensions.WebViewPage">
<namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Optimization"/>
    <add namespace="System.Web.Routing" />
    <add namespace="APE.Web" />
  </namespaces>
</pages>

守则:

namespace MyNameSpace.Web.Extensions
{
public delegate LocalizedString Localizer(string text, params object[] args);

public abstract class WebViewPage : WebViewPage<dynamic>
{
}

/// <summary>
/// Update the pages element /views/web.config to reflect the 
/// pageBaseType="MyNameSpace.Web.Extensions.WebViewPage"
/// </summary>
/// <typeparam name="TModel"></typeparam>
public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel>
{
    private Localizer _localizer;

    /// <summary>
    /// Get a localized resources
    /// </summary>
    public Localizer T
    {
        get
        {
            if (_localizer == null)
            {
                //null localizer
                //_localizer = (format, args) => new LocalizedString((args == null || args.Length == 0) ? format : string.Format(format, args));

                //default localizer
                _localizer = (format, args) =>
                {
                    var resFormat = SampleGetResource(format);
                    if (string.IsNullOrEmpty(resFormat))
                    {
                        return new LocalizedString(format);
                    }
                    return
                        new LocalizedString((args == null || args.Length == 0)
                            ? resFormat
                            : string.Format(resFormat, args));
                };
            }
            return _localizer;
        }
    }

    public string SampleGetResource(string resourceKey)
    {
        const string resourceValue = "Get resource value based on resourceKey";

        return resourceValue;
    }
}

public class LocalizedString : System.MarshalByRefObject, System.Web.IHtmlString
{
    private readonly string _localized;
    private readonly string _scope;
    private readonly string _textHint;
    private readonly object[] _args;

    public LocalizedString(string localized)
    {
        _localized = localized;
    }

    public LocalizedString(string localized, string scope, string textHint, object[] args)
    {
        _localized = localized;
        _scope = scope;
        _textHint = textHint;
        _args = args;
    }

    public static LocalizedString TextOrDefault(string text, LocalizedString defaultValue)
    {
        if (string.IsNullOrEmpty(text))
            return defaultValue;

        return new LocalizedString(text);
    }

    public string Scope
    {
        get { return _scope; }
    }

    public string TextHint
    {
        get { return _textHint; }
    }

    public object[] Args
    {
        get { return _args; }
    }

    public string Text
    {
        get { return _localized; }
    }

    public override string ToString()
    {
        return _localized;
    }

    public string ToHtmlString()
    {
        return _localized;
    }

    public override int GetHashCode()
    {
        var hashCode = 0;
        if (_localized != null)
            hashCode ^= _localized.GetHashCode();
        return hashCode;
    }

    public override bool Equals(object obj)
    {
        if (obj == null || obj.GetType() != GetType())
            return false;

        var that = (LocalizedString)obj;
        return string.Equals(_localized, that._localized);
    }
}
namespace MyNameSpace.Web.Extensions
{
公共委托本地化字符串定位器(字符串文本,参数对象[]args);
公共抽象类WebViewPage:WebViewPage
{
}
/// 
///更新pages元素/views/web.config以反映
///pageBaseType=“MyNameSpace.Web.Extensions.WebViewPage”
/// 
/// 
公共抽象类WebViewPage:System.Web.Mvc.WebViewPage
{
专用航向仪(u航向仪),;
/// 
///获取本地化的资源
/// 
公共定位器
{
得到
{
如果(_localizer==null)
{
//零定位器
//_localizer=(format,args)=>新的LocalizedString((args==null | | | args.Length==0)?格式:string.format(format,args));
//默认定位器
_定位器=(格式,参数)=>
{
var resFormat=SampleGetResource(格式);
if(string.IsNullOrEmpty(resFormat))
{
返回新的本地化字符串(格式);
}
返回
新的LocalizedString((args==null | | args.Length==0)
?重新格式化
:string.Format(resFormat,args));
};
}
返回定位器;
}
}
公共字符串SampleGetResource(字符串resourceKey)
{
const string resourceValue=“根据resourceKey获取资源值”;
返回资源值;
}
}
公共类LocalizedString:System.MarshallByRefObject、System.Web.IHTMLSString
{
私有只读字符串\u本地化;
私有只读字符串_作用域;
私有只读字符串\u textHint;
私有只读对象[]\u参数;
公共本地化字符串(字符串本地化)
{
_本地化=本地化;
}
公共本地化字符串(字符串本地化、字符串范围、字符串文本提示、对象[]args)
{
_本地化=本地化;
_范围=范围;
_textHint=textHint;
_args=args;
}
公共静态LocalizedString文本默认值(字符串文本,LocalizedString默认值)
{
if(string.IsNullOrEmpty(text))
返回默认值;
返回新的本地化字符串(文本);
}
公共字符串范围
{
获取{return\u scope;}
}
公共字符串文本提示
{
获取{return\u textHint;}
}
公共对象[]Args
{
获取{return\u args;}
}
公共字符串文本
{
获取{return\u本地化;}
}
公共重写字符串ToString()
{
返回本地化;
}
公共字符串ToHtmlString()
{
返回本地化;
}
公共覆盖int GetHashCode()
{
var hashCode=0;
如果(_本地化!=null)
hashCode^=_本地化的.GetHashCode();
返回哈希码;
}
公共覆盖布尔等于(对象对象对象)
{
if(obj==null | | obj.GetType()!=GetType())
返回false;
var=(本地化字符串)obj;
返回字符串.Equals(_本地化,即._本地化);
}
}
}