2013-12-10 74 views
1

我想从静态方法运行一个简单的警报脚本(与未来的运行功能的意图),但它不显示我的警报(如果我在页面加载事件它工作正常):无法从静态方法运行Javascript

Page page = HttpContext.Current.CurrentHandler as Page; 

    if (page != null) 
    { 
     string myScript = "<script type=\"text/javascript\" language=\"Javascript\">"; 
     myScript += "alert('hi');"; 
     myScript += "</script>"; 
     page.ClientScript.RegisterClientScriptBlock(page.GetType(), "alert", myScript); 
    } 

如果我调试ClientScript确实运行,请问有人可以帮忙吗?

编辑

这是一个示例脚本,我想success event of ajax webmethod后运行:

<script type="text/javascript"> 
    var OrderReference = '<%= Id %>'; 
    var EID = <%= EId %>; 
    var Comment = ''; 
    var SubDomain = 'track'; 

    if (location.protocol.toLowerCase() == 'https:') 
     wgProtocol = 'https'; 
    else 
     wgProtocol = 'http'; 

    Uri = wgProtocol + '://' + SubDomain + '.test.com/tr.html' + '?&eid=' + EID 
     + '&orderreference=' + OrderReference ; 

    document.write('<sc' + 'ript language="JavaScript" type="text/javascript" src="' + Uri + '"></sc' + 'ript>'); 
</script> 

<noscript> 
    <img src='http://test.com/transaction.html?ver=1&eventid=<%= EId %>&wgorderreference=<%= Id %>&' alt='' /> 
</noscript> 

已经试图返回上面的脚本为字符串,并以AJAX方法尝试以下,但得到400 bad request在Firebug中:

var script = document.createElement('script'); 
script.type = 'text/javascript'; 
script.src = result; 
document.body.appendChild(script); 

E DIT 2:

我创建了这个类:

[Serializable] 
    public class PixelGenericResults 
    { 
     public int Id{ get; set; } 
     public string Script { get; set; } 
    } 

在我的静态方法我做的:

var g = new GenericResults(); 
g.Id = 2; 
g.Script = AffiliateTracking.getScript(g.Id); //This gets me the above script 

HttpContext.Current.Response.ContentType = "application/json"; 
strReturn = new JavaScriptSerializer().Serialize(g); 

,并在成功aspx页面我所做的:

success: function (result) { 
         if (result.hasOwnProperty("d")) { result = result.d; } 
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = result.Script; 
    document.getElementsByTagName('body')[0].appendChild(script); 
} 

但运行它时,我得到这个错误在萤火虫"NetworkError: 404 Not Found - http://localhost:5822/undefined"

+0

如何调用该方法?什么叫它? –

+0

我正在使用ajax来调用一个静态的[WebMethod]并且正在调用上述方法.. – Zaki

+1

@Zaki这就是要点:使用AJAX,你不能直接在服务器端与客户端页面交互,你必须返回一些值给AJAX调用,然后通过JS动作客户端来创建警报 – LittleSweetSeas

回答

0

正如评论中所述,您不能直接与使用AJAX调用呈现的页面进行交互,因此您必须在客户端执行一些工作。

这里一个例子,根据你的代码向我们展示:

C#:

//import this namespace: 
using System.Web.Script.Serialization; 

// declare a class to contain all the info you will need client-side 
[Serializable] 
public class GenericResult 
{ 
    public int OrderReference { get; set; } 
    public string URL {get; set;} 
    public string EID { get; set; } 
    public string Comment { get; set; } 
    // etc. etc. 
} 

//In your static method, instance and populate such class: 
var r = new GenericResult(); 
r.OrderReference = 34; 
r.URL = "http://www.google.com"; 
r.EID = "someString"; 
r.Comment = "this will work like a charm"; 
this.Response.ContentType = "application/json"; 
this.Response.Write(new JavaScriptSerializer().Serialize(r)); 

JS:

//In your AJAX 'onsuccess' callback, you can use the object very easily, eg: 
function callback(r){ 
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = r.URL; 
    document.getElementsByTagName('body')[0].appendChild(script); 
} 

我没有测试过这一点,所以它可能包含任何错别字,但这应该足以让您调整代码。

编辑:

success: function (result) { 
    //what is the next line for?!?!?! 
    //if (result.hasOwnProperty("d")) { result = result.d; } 

    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = result.Script; 
    document.getElementsByTagName('body')[0].appendChild(script); 
} 
+0

你能看到我的第二次编辑...我得到错误。 – Zaki

+0

请帮我帮忙。做一些调试,并检查问题现在在哪里,我可以看到我可以告诉你,你的代码甚至不应该编译,因为* g.RequestId *没有在PixelGenericResults类中声明。 – LittleSweetSeas

+0

尝试“alert(result); alert(result.Id);”在你的JS回调中作为第一条语句来检查JSON对象是否正确到达那里。 – LittleSweetSeas

相关问题