【问题标题】:Can not run Javascript from static method无法从静态方法运行 Javascript
【发布时间】:2013-12-10 15:55:07
【问题描述】:

我正在尝试从静态方法运行一个简单的警报脚本(打算将来运行函数),但它没有向我显示警报(如果我在页面加载事件中这样做,它工作正常):

 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 方法中尝试了以下但在 Firebug 中得到 400 bad request

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

编辑 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);
}

但在运行它时,我在 firebug "NetworkError: 404 Not Found - http://localhost:5822/undefined" 中收到此错误

【问题讨论】:

  • 方法是如何调用的?它叫什么?
  • 我正在使用 ajax 调用静态 [WebMethod] 并且调用上述方法..
  • @Zaki 这就是重点:使用 AJAX 您不能直接在服务器端与客户端页面交互,您必须向 AJAX 调用返回一些值,然后通过 JS 在客户端执行创建警报
  • @LittleSweetSeas 我可以像你描述的那样创建简单的警报..但是想象一下,如果我有一个大脚本,那么 document.write 和成功的 ajax webmethod 想要注册它......跨度>
  • A [WebMethod] 对已经呈现的页面没有任何影响。它也不会导致呈现新页面。它所能做的就是将信息传回给客户端,客户端可以更新页面。

标签: javascript asp.net ajax c#-4.0 webmethod


【解决方案1】:

如 cmets 中所述,您无法直接与已使用 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);
}

【讨论】:

  • 请帮帮我。进行一些调试并检查问题出在哪里,据我所知,我可以告诉您您的代码甚至不应该编译,因为 g.RequestId 未在 PixelGenericResults 类中声明。
  • 也试试“alert(result);alert(result.Id);”在您的 JS 回调中作为第一条语句,检查 JSON 对象是否正确到达那里。
  • 是的,我不得不简化课程:)..它是固定的。它确实编译并且可以在脚本属性中看到我的脚本。我确实在 script.src 上发出了警告,并得到了 localhost:5822/undefined..sorry 是新手
  • 请发布您的 ajax 调用,因为问题出在那儿 ;)
  • 已在上面编辑过..edit2...也用于警报(结果);我可以看到我的属性,例如id,脚本等,但用于警报(result.Id);我不确定..
猜你喜欢
  • 2015-08-17
  • 1970-01-01
  • 2011-06-25
  • 2015-10-17
  • 1970-01-01
相关资源
最近更新 更多