Динамически писать код Javascript? - PullRequest
4 голосов
/ 27 декабря 2011

Я создаю динамические сайты с той же кодовой базой, где мне нужно будет отображать соответствующий код JavaScript рекламных объявлений Google, основываясь на некоторой логике.

В моей среде .Net 4, MVC3 я настроил следующий сценарий:

Переход на www.mysite.com/script_processor/ возвращает следующий текст:

function doAlert(v1, v2){alert('Called alert()' + v1 + ' : ' + v2);}

Этот текст взят из моей модели как таковой:

page.stringResponse = "function doAlert(v1, v2){alert('Called alert()' + v1+ ' : ' + v2);}";   

Затем я могу сделать что-то подобное с отдельного сайта / страницы:

<script type="text/javascript" src="http://mysite.com/script_processor/">
</script>
<script type="text/javascript">
    doAlert('string 1', 'string 2');
</script>

Как и следовало ожидать, яполучите окно с предупреждением «Called alert () string 1: string 2», чтобы функция на mysite.com была доступна с сайта 2.

Очевидно, что когда я делаю источник просмотра на странице, я вижу тольковызов doAlert (), а не содержимое функции, которая находится на mysite.com.

Теперь вместо doAlert () на mysite.com я хочу иметь функцию, которая динамически записывает javascript, которыйКогда он будет вызван, на сайте 2 будет отображаться значок.

Я создал метод модели:

public GetResponsePage GetPageResponse(string V1, string V2)
{
    var page = new GetResponsePage();
    page.stringResponse = "<script type=\"text/javascript\">document.write('testing injected Javascript.');alert('value of v1: " + V1 + "value of v2: " + V2 + "');</script>";
    return page;
}

При переходе к маршруту я вижу всплывающее окно и "тестирование внедряет Javascript."на странице.

Когда я ссылаюсь на это с сайта 2, я не вижу всплывающего окна и не вижу "тестирования внедренного Javascript" в источнике страницы.

Как я уже упоминал, япозже заменит это на JS-код для соответствующего js-кода Google Ads.

Не думаю, что это работает совершенно правильно ... что мне не хватает?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 декабря 2011

Вы можете использовать вечное зло eval для динамического выполнения JavaScript. JavaScript, который вы передаете, может также объявлять функции.

eval("function doAlert(v1, v2){alert('Called alert()' + v1 + ' : ' + v2);}");

Я не уверен, точно , что вы пытаетесь достичь, но вы могли бы сделать eval-вызов вот так, куда хотите:

function createDoAlertFunction(){
    eval("function doAlert(v1, v2){alert('Called alert()' + v1 + ' : ' + v2);}");
}

Только заметьте, что этого следует избегать . Придерживайтесь объявления своих функций старомодным способом, каким вы уже являетесь.

EDIT

О, вы хотите MVC , чтобы динамически внедрять JavaScript. MVC имеет JavaScriptResult , но похоже, что его использование сильно, сильно не рекомендуется.

Тем не менее, вот ссылка , которая показывает его использование

public ActionResult DoSomething() {  
   string s = "$('#some-div').html('Updated!');";  
   return JavaScript(s);  
}  

и почему это не очень хорошая идея

0 голосов
/ 02 апреля 2018

Я знаю, что очень поздно. Но есть очень простой способ отправить JavaScript с контроллера.

 @Html.Raw("<script>" + @ViewBag.DynamicScripts + "</script>")

В контроллере отправьте JavaScript следующим образом:

 ViewBag.DynamicScripts = "alert('test');";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...