控制器中的Html帮助器

时间:2011-10-29 15:05:16

标签: asp.net-mvc-3

我有一个扩展方法,用于从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 */);

3 个答案:

答案 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)

这是不可能的,因为在控制器上下文中尚未确定您将使用的视图。