Доступ к тегам сервера внутри Javascript в проекте MVC
-
18-09-2019 - |
Вопрос
Я хотел бы использовать некоторые теги сервера внутри функции Javascript:
<%=Model.HtmlProperty%>
Раньше я сохранял это значение в скрытом поле ввода, но когда свойство содержит HTML, возникают проблемы со специальными символами, такими как кавычки.Я хотел бы избежать необходимости кодировать и декодировать в контроллере, чтобы избежать проблем со специальными символами.
У Рика Страла есть пара посты по этой проблеме в проекте веб-форм, но я ищу элегантное решение для проекта MVC.
ОБНОВЛЯТЬ:Ответ Роберта Харви ниже предлагает закодировать html.Опять же, это это не то, что я хочу делать.В конечном итоге я пытаюсь внедрить HTML-скрипт в экземпляр fckeditor.Это должно быть сделано в javascript.Я пытаюсь понять, как получить доступ к значению <%=Model.HtmlProperty%>
внутри javascript без хранения закодированного текста в скрытом элементе ввода.
Решение 2
Кажется, то, что я надеялся сделать — использовать теги сервера внутри javascript — невозможно.Я хранил строку внутри скрытого элемента ввода, и, судя по комментарию queen3, похоже, мне придется продолжать делать то, что я делал все это время.Спасибо всем за ваш вклад.
Другие советы
Заимствовав сообщение Рика Страла и немного изменив сигнатуру вызова, функция кодирования строки javascript (после изменения ее в метод расширения для класса Html) выглядит следующим образом:
public static string EncodeJsString(this HtmlHelper h, string s)
{
StringBuilder sb = new StringBuilder();
sb.Append("\"");
foreach (char c in s)
{
switch (c)
{
case '\"':
sb.Append("\\\"");
break;
case '\\':
sb.Append("\\\\");
break;
case '\b':
sb.Append("\\b");
break;
case '\f':
sb.Append("\\f");
break;
case '\n':
sb.Append("\\n");
break;
case '\r':
sb.Append("\\r");
break;
case '\t':
sb.Append("\\t");
break;
default:
int i = (int)c;
if (i < 32 || i > 127)
{
sb.AppendFormat("\\u{0:X04}", i);
}
else
{
sb.Append(c);
}
break;
}
}
sb.Append("\"");
return sb.ToString();
}
Что должно позволить вам называть это так:
<%= Html.EncodeJsString(Model.HtmlProperty) %>
Используйте HTMLHelper, чтобы писать скрипты «на лету».
public static string WriteLightboxScript(this HtmlHelper helper, string galleryName)
{
var builder = new TagBuilder("script");
builder.MergeAttribute("type", "text/javascript");
builder.SetInnerText("$(function() {$('a[rel=" + galleryName + "]').lightBox();});");
return builder.ToString(TagRenderMode.Normal);
}