使用JQuery编写时,变音符号在Web App中无法正确呈现
我有一个我正在本地化的MVC 4应用程序。 所有内置资源和模型归属内容都显得很好,但在我为JQuery编写的本地化内容中,编码显示错误。 这是一个渲染事物的例子,注意红色框……它们应该是同一个单词。
问题似乎围绕我的视图中的以下代码行:
$("#FirstName").Watermark("@Resources.ApplicantGivenNameWatermark");
这个JQuery本质上接受一个字符串,然后在没有提供其他值时将其写入输入。 这是该代码的摘要:
$.fn.Watermark = function (text) { return this.each( function () { var input = $(this); map[map.length] = { text: text, obj: input }; //Similar removal process lies here, this one also removes the style function insertMessage() { if (input.val().length == 0 || input.val() == text) { input.val(text); input.addClass("watermark"); } else input.removeClass("watermark") } input.focus(clearMessage); input.blur(insertMessage); input.change(insertMessage); insertMessage(); } ); };
任何关于如何解决这个问题的想法将不胜感激。 作为旁注,我已经能够在各种浏览器中可靠地重新创建它。
试着把它放在函数的开头:
text=$(''+text+'').text();
问题是Razor是为输出HTML而不是Javascript而构建的。 默认情况下,它会使用HTML实体对所有字符串进行编码 – 这些字符串不适合Javascript字符串。
您可以使用@Html.Raw(Model.YourString)
,但这会给您带来其他问题,例如不转义引号等(标准Razor输出通过“意外”执行)。
如果你使用的是.NET 4.0 / MVC 3,你可以使用AjaxHelper的JavaScriptStringEncode
,它返回一个IHtmlString
(意思是Razor不会对它进行实体编码),但也可以进行正确的特定于Javascript的转义(包括源字符串中的换行符) ,标准的Razor编码不会“修复”):
$("#FirstName").Watermark( "@Ajax.JavaScriptStringEncode(Resources.ApplicantGivenNameWatermark")");
(是的,它变得相当冗长……但确实具有从根本上解决问题的优势,而不是通过jQuery解决它 – 你当然可以使用一个名为JavaScriptStringEncode
的短名称来帮助它。
请注意,它也是HttpUtility
的静态方法 – 更容易从自定义助手调用而不是创建AjaxHelper
实例,但请注意,与AjaxHelper
不同, HttpUtility
上的方法返回一个简单的字符串,因此您需要将其包装在HtmlString
避免HTML编码。