MVC3 Razor удаляет теги скрипта из HtmlString

#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. Я пробовал и до сих пор никаких изменений. Я начинаю чувствовать, что есть что-то еще, а не код, который делает это возможным. Понятия не имею, что это может быть.