动态编写 Javascript 代码?

ElH*_*aix 5 javascript asp.net-mvc dynamic asp.net-mvc-3

我正在使用相同的代码库创建动态网站,我需要根据某些逻辑在其中显示适当的 Google 广告 Javascript 代码。

在我的 .Net 4, MVC3 环境中,我设置了以下场景:

导航到 www.mysite.com/script_processor/ 返回以下文本:

function doAlert(v1, v2){alert('Called alert()' + v1 + ' : ' + v2);}
Run Code Online (Sandbox Code Playgroud)

这段文字来自我的模型:

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

然后我可以从一个单独的站点/页面做这样的事情:

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

如您所料,我收到一个带有“Called alert() string 1 : string 2”的警告框,因此可以从站点 2 访问 mysite.com 上的函数。

显然,当我从页面查看源代码时,我只看到 doAlert() 调用,而不是位于 mysite.com 上的函数的内容。

现在,我想要一个函数,而不是 mysite.com 上的 doAlert(),它可以动态写出 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;
}
Run Code Online (Sandbox Code Playgroud)

导航到路线时,我看到了弹出窗口和“测试注入的 Javascript”。在页面上。

当我从站点 2 引用它时,我没有看到弹出窗口,也没有在页面源代码中看到“测试注入的 Javascript”。

正如我所提到的,我稍后会将其替换为相应 Google Ads js 代码的 JS 代码。

我认为这不太正确......我错过了什么?

谢谢。

Ada*_*kis 3

你可以使用everevileval来动态执行JavaScript。您传入的 JavaScript 也可以声明函数。

eval("function doAlert(v1, v2){alert('Called alert()' + v1 + ' : ' + v2);}");
Run Code Online (Sandbox Code Playgroud)

我不确定你到底想要完成什么,但你可以在任何你想要的地方进行这样的 eval 调用:

function createDoAlertFunction(){
    eval("function doAlert(v1, v2){alert('Called alert()' + v1 + ' : ' + v2);}");
}
Run Code Online (Sandbox Code Playgroud)

但请注意,应该避免这种情况。坚持以老式的方式声明你的函数,就像你已经这样做的那样。

编辑

哦,您希望MVC动态注入 JavaScript。MVC 有一个JavaScriptResult,但看起来它的使用非常非常强烈不鼓励的。

尽管如此,这里有一个显示其用法的链接

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

以及为什么这不是一个好主意