#jquery #asp.net #json #jquery-templates
#jquery #asp.net #json #jquery-шаблоны
Вопрос:
Я столкнулся с проблемой отображения шаблона jQuery, где JSON записывается непосредственно в HTML, а затем передается в шаблоны jquery при загрузке для отображения части экрана.
У меня есть простая функция, которая загружает шаблон:
function templateLoader(templateID, containerID, serializedData) {
var json = $.parseJSON(serializedData);
$("#" templateID).tmpl(json).appendTo("#" containerID);
};
Это сбой, говорящий о недопустимости JSON. Вот как выглядит вызывающий объект:
<script type='text/javascript'>
jQuery(function () {
templateLoader('questionTemplate',
'questionContainer',
'[{"ID":1,"Text":"something with an escaped "double quote" and a single quote does the unicode versionu0027s end of string"}]');
});
</script>
JSON создается вызовом JavaScriptSerializer.serialize() и выводится в ASP.NET Просмотр MVC с помощью <%= JavaScriptSerializer.serialize(модель.вопросы) %>
Сам JSON проходит различные тесты проверки JSON.
Я понимаю, что сам javascript экранирует двойные кавычки, оставляя двойные кавычки открытыми для вызова parseJSON() jQuery.
Мой вопрос в том, где лучше всего это исправить? Должен ли я после обработки вызова JavaScriptSerializer serialize добавить дополнительное экранирование или перейти с экранирования на выполнение «замен»? Похоже, что это было бы более распространенной проблемой.
Ответ №1:
Если вы встраиваете его, зачем использовать JSON или JSON.parse
вообще? Почему не просто литералы:
templateLoader('questionTemplate',
'questionContainer',
[{"ID":1,"Text":"something with an escaped "double quote" and a single quote does the unicode versionu0027s end of string"}]);
Очевидно, что вы должны внести соответствующие изменения templateLoader
. Вы можете изменить serializedData
на json
(за исключением того, что название вводит в заблуждение, поскольку json
на самом деле это массив, не строка JSON), затем удалить первую строку функции.
Комментарии:
1. Это правда, просто используйте сериализуемый необработанный литерал, шаблон jQuery примет его как есть, нет необходимости в дальнейшем разборе. Спасибо!
Ответ №2:
(для кого-то, кто борется с той же проблемой)
Использовать HttpUtility.JavaScriptStringEncode
Ваш серверный тег станет похожим
<%= HttpUtility.JavaScriptStringEncode(JavaScriptSerializer.serialize(model.questions)) %>
Ответ №3:
Можете ли вы попробовать это?
<script type='text/javascript'>
jQuery(function () {
templateLoader('questionTemplate',
'questionContainer',
'[{"ID":1,"Text":"something with an escaped \"double quote\" and a single quote does the unicode versionu0027s end of string"}]');
});
</script>
Комментарии:
1. Да, это действительно работает. Хотя, мой вопрос на самом деле заключается в том, как наилучшим образом выполнить эту кодировку. С тех пор я использую класс JavaScriptSerializer в .NET. Я, конечно, могу обработать то, что он делает, и добавить дополнительные обратные косые черты, но избегать escape как в C #, так и в Javascript неудобно, поэтому любопытно, нашли ли другие лучшие решения.