我有一个方法可以抓取给定字符串的本地化并返回它。此方法由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)
。
如果我致电<span class&eq;"...
,则会对文字进行两次编码,呈现的页面会显示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
答案 0 :(得分:2)
鉴于您评论过您想要制作
@Html.localize("textId")
输出一个HTML元素,解决方案似乎很明显:返回类型为string
,这在设计上是不可能的。因此,请将方法更改为不返回string
。
您已经发现原则上可以使用HtmlHelper.Raw
返回IHtmlString
,但IHtmlString
不能分配给string
。如果您将退货类型更改为IHtmlString
,则问题已解决。
答案 1 :(得分:2)
我认为你应该用这种方式创建你的方法:
Localize
方法应该只尝试返回已本地化的string
。添加html标签不是此方法的关注点。 (您也可以在这里添加html标签,没有任何问题,因为在下一个方法中,我们使用HtmlString
来创建输出。)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')
将呈现为正确的标记