Диакритические знаки неправильно отображаются в Web App при написании с помощью JQuery - PullRequest
1 голос
/ 07 февраля 2012

У меня есть приложение MVC 4, которое я локализую.Весь встроенный ресурс и Model атрибутивный контент выглядят хорошо, но там, где я локализовал контент, написанный для JQuery , кодировка выглядит неправильно.Вот пример того, как вещи рендерится, обратите внимание на красные прямоугольники ... они должны быть одним и тем же словом.

enter image description here

Проблема, кажется, вращается вокруг строки кода ниже вmy View :

$("#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();
        }
    );
};

Любые идеи о том, как решить эту проблему, будут оценены.Как примечание, я смог надежно воссоздать это в широком спектре браузеров.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Проблема в том, что Razor создан для вывода HTML, а не Javascript. По умолчанию он закодирует все ваши строки с помощью HTML-сущностей, которые не подходят для строк Javascript.

Вы могли бы использовать @Html.Raw(Model.YourString), но это создаст вам другие проблемы, такие как невозможность избежать кавычек и т. Д. (Стандартный вывод Razor делает это "случайно").

Если вы используете .NET 4.0 / MVC 3, вы можете использовать AjaxHelper's JavaScriptStringEncode, который возвращает IHtmlString (что означает, что Razor не будет кодировать его сущностью), но также выполняет надлежащее специфичное для Javascript экранирование ( включая разрывы строк в исходной строке, которые стандартная кодировка Razor не «исправит»):

$("#FirstName").Watermark(
   "@Ajax.JavaScriptStringEncode(Resources.ApplicantGivenNameWatermark")");

(Да, это получается довольно многословно ... но имеет преимущество в том, что исправляет проблему в корне, вместо того, чтобы обходить ее с помощью jQuery - конечно, вы можете создать помощника с коротким именем, которое называется JavaScriptStringEncode .

Обратите внимание, что это также статический метод в HttpUtility - проще вызывать из пользовательского помощника, чем создавать экземпляр AjaxHelper, но обратите внимание, что в отличие от AjaxHelper, метод в HttpUtility возвращает простую строку, поэтому вам нужно будет обернуть его в HtmlString, чтобы избежать кодирования HTML.

3 голосов
/ 07 февраля 2012

Попробуйте поставить это в начале функции:

text=$('<span>'+text+'</span>').text();
...