Прежде всего, если вы извлекаете вопросы из базы данных при загрузке страницы, у вас, скорее всего, тоже есть ответы на все вопросы, так что просто продолжайте свой текущий подход, вставляя ответы на страницу, как это делает ваш пример кода. , Если ваш список часто задаваемых вопросов не содержит тысячи и тысячи вопросов, выполнение этого «AJAX-пути» путем нажатия на кнопку «db» при каждом щелчке элемента списка не даст вам особого значения в ИМО. Если у него так много вопросов, тогда прямой список - неправильный путь.
Во-вторых, необходимо помнить о двух вещах:
- вы помещаете html в атрибут html
- атрибут задает функцию javascript для вызова
Таким образом, вы должны убедиться, что ваш «ответ» избегает как html , так и , действительных js. Под действительным js я имею в виду, что у него не может быть новых строк, и он должен корректно экранировать кавычки. Например, следующий html - хотя и действительный html - не сработает onclick, и вы просто получите синтаксическую ошибку js:
<li onclick="setFAQ('This line's
multi line and has a single quote in it!')"
Чтобы учесть это, я бы сказал, что HttpUtility.HtmlAttributeEncode
в тандеме с System.Web.Script.Serialization.JavaScriptSerializer
больше подходит для разметки, которую вы показали.
JavaScriptSerializer json = new JavaScriptSerializer();
string answerString = "This line's\nmulti line and has a single quote in it!";
string onClickJS = String.Format("setFAQ({0})", json.Serialize(answerString));
string onClickAttr = HttpUtility.HtmlAttributeEncode(onClickJs);
Еще лучше - использовать объект * .NET 1021 *. Потерять HtmlAttributeEncode
в целом:
ListItem faqItem = new ListItem(questionString);
faqItem.Attributes.Add("onclick", String.Format("setFAQ({0})", json.Serialize(answerString)));
html-часть автоматически экранируется для вас, плюс она намного чище.
Что касается вашего javascript, вам не нужно ничего декодировать в setFAQ()
. Просто возьмите его аргумент и вставьте его в свой «ответ» div:
function setFAQ(answer) {
document.getElementById('answer').innerHTML = answer
}