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