从非MVC类

时间:2016-03-22 11:42:56

标签: c# asp.net-mvc razor

我有一个方法可以抓取给定字符串的本地化并返回它。此方法由HtmlHelper的扩展方法调用,因此可以从Razor视图访问它。但是,有时我们也会在控制器和其他非Razor地方使用它,这就是为什么我们拥有内部"方法。

现在,出于调试目的,我想将返回的,本地化的(或可能不是)字符串包装成某些HTML(类似<span class="localized">Returned text</span>)。但是,如果我写

return string.Format("<span class=\"localized\">{0}</span>", text);

然后呈现的页面包含<>字符,就像它们是HTML编码的一样,因此输出是假的。

我当然不能致电HtmlHelper.Raw(string s),部分原因是因为我不知道如何从MVC控制器外部创建HtmlHelper,然后因为它返回一个IHtmlString string不能分配给HttpUtility.HtmlEncode(string s)

如果我致电&lt;span class&eq;&quot;...,则会对文字进行两次编码,呈现的页面会显示Helper

如何在视图中使用呈现为HTML的字符串?

修改

这里的代码来自public static string localize(string textId) { string ret = ""; // Query to obtain the localized string, // or to obtain a fallback in case there are issues // (missing localization, wrong id...) // In the end, ret is filled with the output string #if !OFFICIAL ret = string.Format("<span class=\"localized\" title=\"{1}\">{0}</span>", ret, expression); #endif return ret; } public static string localize(this HtmlHelper htmlhelper, string expression) { return trad(textId); } 静态类(所有扩展方法都有效,除非它们行为错误):

EmployeeID  NAME  AGE
----------------------
     1      Tom    28
     2      John   30
     3      Tony   32

3 个答案:

答案 0 :(得分:2)

鉴于您评论过您想要制作

@Html.localize("textId")

输出一个HTML元素,解决方案似乎很明显:返回类型为string,这在设计上是不可能的。因此,请将方法更改为不返回string

您已经发现原则上可以使用HtmlHelper.Raw返回IHtmlString,但IHtmlString不能分配给string。如果您将退货类型更改为IHtmlString,则问题已解决。

答案 1 :(得分:2)

我认为你应该用这种方式创建你的方法:

  • 非帮助Localize方法应该只尝试返回已本地化的string。添加html标签不是此方法的关注点。 (您也可以在这里添加html标签,没有任何问题,因为在下一个方法中,我们使用HtmlString来创建输出。)
  • 辅助方法应使用以前的方法,然后添加所需的html标记,最后返回HtmlString

<强>代码:

public static class Extensions
{
    public static string Localize(string exp)
    {
        var ret = exp;
        try
        {
            //try to apply localized version of exp, for example:
            ret = exp + "_Localized";
        }
        catch(Exception ex)
        { 
            //Log ex
        }

        return ret;
    }

    public static IHtmlString Localize(this HtmlHelper htmlhelper, string exp)
    {
        var ret = string.Format("<span class=\"localized\" title=\"{0}\">{1}</span>",
                                exp, Localize(exp));
        return new HtmlString(ret);
    }
}

答案 2 :(得分:1)

Razor按原样渲染string。您应该使用HtmlString作为带标记的扩展方法。

如果您按如下方式声明方法:

public static HtmlString localize(this HtmlHelper htmlhelper, string expression)
{
    return new HtmlString(trad(textId));
}

您可以使用自己的扩展方法,例如

@Html.localize('your string')

将呈现为正确的标记