我有一个扩展方法,用于从asp.net mvc 3
中的资源文件中获取字符串public static string Resource(this HtmlHelper htmlHelper, string expression, params object[] args)
{
string path = ((RazorView)htmlHelper.ViewContext.View).ViewPath;
var fields =
(ResourceExpressionFields)
(new ResourceExpressionBuilder()).ParseExpression(expression, typeof(string), new ExpressionBuilderContext(path));
return (!string.IsNullOrWhiteSpace(fields.ClassKey))
? string.Format((string)htmlHelper.ViewContext.HttpContext.GetGlobalResourceObject(
fields.ClassKey,
fields.ResourceKey,
CultureInfo.CurrentUICulture), args)
: string.Format((string)htmlHelper.ViewContext.HttpContext.GetLocalResourceObject(
path,
fields.ResourceKey,
CultureInfo.CurrentUICulture), args);
}
以下是我使用此方法的方法
@Html.LabelFor(m => m.Login, Html.Resource("LoginBoxLoginField"))
但我不知道如何在控制器
的动作中使用它public ActionResult MyAction()
{
//how to get string from resource file using my extension method?
}
例如
if (!ModelState.IsValid)
ModelState.AddModelError(string.Empty, string.Empty/* should be resource string */);
答案 0 :(得分:3)
您无法在控制器中使用它,因为您在控制器中没有HtmlHelper实例。要创建HtmlHelper实例,您需要一个ViewContext。并且您只在视图中有视图上下文。如果你想在控制器中使用它,你将不得不重构它,这样这个助手只依赖于HttpContext而不依赖于HtmlHelper。
答案 1 :(得分:2)
在名为Resource.resx的项目中创建资源时,您只需调用:
Resource.LoginBoxLoginField
或
Resource.ResourceManager.GetString("LoginBoxLoginField")
如果您创建另一个名为Resource.pt-BR.resx的资源文件,并将应用程序的文化设置为pt-BR
,则这种方式可以正常工作答案 2 :(得分:1)
这是不可能的,因为在控制器上下文中尚未确定您将使用的视图。