#javascript #asp.net-mvc-3 #razor
#javascript #asp.net-mvc-3 #razor
Вопрос:
У меня есть метод, который добавляет javascript в конец частичных представлений, если это запрос ajax. Однако моя проблема заключается в том, что при возврате скрипта теги скрипта были удалены, а функция, которую я хочу выполнить, написана обычным текстом.
if (httpContext.Request.IsAjaxRequest())
{
script = "MyNamespace.globals.initFunctions.push(function() { " script " });";
return new HtmlString(@"<script type=""text/javascript"">" script "</script>");
}
Итак, вместо получения желаемого результата
<script type="text/javascript">MyNamespace.globals.initFunctions.push(function() { MyNamespace.init(); });</script>
Я получаю MyNamespace.globals.initFunctions.push(function() { MyNamespace.init(); });
обычный текст.
В чем может быть причина?
Редактировать:
Попытка сделать это с помощью Html.Raw() не помогла. Хотя строка скрипта содержит теги скрипта, они все равно удаляются при визуализации.
@{
string script = ViewUtilities.AddScript("MyNamespace.init();", this.ViewContext.HttpContext);
}
@Html.Raw(script);
Редактировать 2:
Теперь я попытался записать все это в виде, подобном этому,
<script type="text/javascript">
MyNamespace.globals.initFunctions.push(function() { MyNamespace.init(); });
</script>
и он по-прежнему удаляет теги вокруг скрипта и отображает его как обычный текст.
Я не знаю, куда идти дальше…
Когда я проверяю ответ с помощью Firebug, он выглядит нормально, но, глядя на html, это не так.
Комментарии:
1. Вы когда-нибудь это понимали? Я получаю то же самое в простом виде, где мои теги скрипта удаляются
Ответ №1:
Кодируется HTML, что происходит автоматически с помощью ASP.NET MVC.
Использование @Html.Raw("htmlstring")
должно дать вам исходное HTML-значение строки без удаления тегов.
Комментарии:
1. Я обновил свой вопрос, попробовав это. К сожалению, это не сработало.
2. У вас должно быть что-то еще. HTML. Raw — это ответ. Вставьте это на свою страницу. Работает ли это? Работает здесь.
@{ var someScript = "<script type="text/javascript">alert('stuff!');</script>"; } @Html.Raw(someScript)
Ответ №2:
Вы хотите использовать @Html.Raw(whatever function you call)
Я думаю, вы также, вероятно, захотите вернуть return MvcHtmlString.Create(fullscript)
;
Комментарии:
1. Не имело значения. Возвращаемая строка каким-то образом удаляет свои теги скрипта.
Ответ №3:
Если вы преобразуете это в метод HtmlHelper, он будет работать. Измените свой ViewUtilities
класс следующим образом:
public static class ViewUtilities
{
public static MvcHtmlString AddScript(this HtmlHelper htmlHelper, string script)
{
if (htmlHelper.ViewContext.HttpContext.Request.IsAjaxRequest())
return new MvcHtmlString(@"<script type=""text/javascript"">" script "</script>");
return new MvcHtmlString("");
}
}
Затем в web.config
файле в Views
папке (и в любых папках Views в любых областях) добавьте следующее в namespaces
список в <pages pageBaseType="System.Web.Mvc.WebViewPage">
элементе:
<add namespace="{namespace where ViewUtilities class is located}"/>
Наконец, на ваш взгляд:
@Html.AddScript("MyNamespace.init();")
Комментарии:
1. Спасибо за идею HtmlHelper. Я пробовал и до сих пор никаких изменений. Я начинаю чувствовать, что есть что-то еще, а не код, который делает это возможным. Понятия не имею, что это может быть.