【发布时间】:2016-03-22 11:42:56
【问题描述】:
我有一个方法可以获取给定字符串的本地化并返回它。此方法由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;...。
我应该怎么做才能在视图中有一个呈现为 HTML 的字符串?
编辑
这是来自 Helper 静态类的代码(所有扩展方法都有效,除了它们的行为错误):
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);
}
【问题讨论】:
-
你的
string.Format方法是从哪里调用的? -
IHtmlString.ToString()返回string -
@Lee,来自inner方法内部,可以被
HtmlHelper扩展方法调用,也可以从其他地方调用。 -
@StephenMuecke,你是对的,但我无法浏览项目的所有视图并将
@Html.localize("textId")更改为@Html.localize("textId").ToString()... -
问题是由于将本地化置于 HTML 级别的不幸决定造成的,现在您正试图通过编程解决问题。恕我直言,唯一真正的解决方案是重新设计解决方案的这一部分,例如通过创建一个 LocalizationHelper 然后从 HTML 中使用它,而不是相反。
标签: c# asp.net-mvc razor