asp.net回调javascript

using System; 
using System.Collections; 
using System.IO; 
using System.Text; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.ComponentModel; 
namespace Platform 
{ 
 
 
 /// <summary> 
 /// 可以处理客户端的jscript的回调 
 /// </summary> 
 [DefaultProperty(""), 
  ToolboxData("<{0}:ScriptCallbackManager runat=server></{0}:ScriptCallbackManager>")] 
 public class ScriptCallbackManager : System.Web.UI.WebControls.WebControl 
 { 
  private ICallbackEventHandler _handler; 
  private String _functionNameAfterCallback; 
        public ScriptCallbackManager() { 
            //_handler = (ICallbackEventHandler)Page; 
        }

        /// <summary> 
        /// 回调完执行的客户端函数 
        /// </summary> 
  public string FunctionNameAfterCallback 
  { 
   get { return _functionNameAfterCallback; } 
            set { _functionNameAfterCallback = value; } 
  } 
  public ICallbackEventHandler CallbackEventHandler 
  { 
   get { return _handler; } 
            set { _handler = value; } 
  }
  /// <summary> 
  /// 将此控件呈现给指定的输出参数。 
  /// </summary> 
  /// <param name="output"> 要写出到的 HTML 编写器 </param> 
  protected override void Render(HtmlTextWriter output) 
  { 
   output.Write(this.GetCallbackEventReference()); 
  } 
  protected override void OnInit(EventArgs e){ 
   base.OnInit(e); 
   try { 
    this.HandleRequest(); 
            } 
   catch (Exception ex){ 
                object o = ex; 
   } 
  } 
  private void HandleRequest(){ 
   HttpRequest request = this.Page.Request; 
   HttpResponse reponse = this.Page.Response; 
   String sType = request["type"]; 
   if ((sType != null) && (sType == "__scriptcallback:" + this.ID)) 
   { 
    String sRequest = this.GetRequestContent(request); 
    String sResult = this.CallHandler(sRequest); 
    reponse.Clear(); 
    reponse.Expires = 0; 
    reponse.Write(sResult); 
    reponse.End(); 
   } 
  } 
  private String GetRequestContent(HttpRequest request) { 
   HttpRequest r = request; 
   String s = r.ToString(); 
   using (StreamReader reader = new StreamReader(request.InputStream)) { 
    return reader.ReadToEnd(); 
   } 
  } 
        private String CallHandler(String param) { 
            if (this.CallbackEventHandler != null) { 
                return this.CallbackEventHandler.RaiseCallbackEvent(this, param); 
            } 
            return ""; 
        } 
  /* 
  private ICallbackEventHandler GetScriptCallbackHandlerOnPage(String id) 
  { 
   return this.GetScriptCallbackHandler(this.Page, id); 
  } 
  private ICallbackEventHandler GetScriptCallbackHandler(Control control, String id) 
  { 
   if ((control is ICallbackEventHandler) && (control.ID == id)) 
   { 
    return control as ICallbackEventHandler; 
   } 
   foreach(Control child in control.Controls) 
   { 
    ICallbackEventHandler handler = GetScriptCallbackHandler(child, id); 
    if (handler != null) 
    { 
     return handler; 
    } 
   } 
   return null; 
  } 
  */ 
        private String GetCallbackEventReference() 
        { 
         StringBuilder sb = new StringBuilder(); 
   sb.Append("<script>"); 
   sb.Append("function " + this.ID + "(param, context) {"); 
   sb.Append("var xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');"); 
   sb.Append("xmlhttp.Open('POST', '" + HttpContext.Current.Request.Url.ToString() + "?type=__scriptcallback:" + this.ID + "', false);"); 
   sb.Append("xmlhttp.Send(param);"); 
   sb.Append(this.FunctionNameAfterCallback + "(xmlhttp.responseText, context);"); 
   sb.Append("}"); 
   sb.Append("</script>"); 
   return sb.ToString(); 
        } 
 } 
} 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hbbliyong

.Net下SQLite的DBHelp

怎样获取SqLite请参考初识SqlLite ---.net连接数据库,怎样在SQLite使用Linq请参考在C#中利用Nuget包使用SQLite数据库和Li...

3094
来自专栏木宛城主

曾经的代码系列——AJAX和JSON生成下拉列表框

代码测试使用 前台页面 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GetGradeC...

1917
来自专栏别先生

fastjson如何判断JSONObject和JSONArray

1、fastjson如何判断JSONObject和JSONArray,百度一下,教程还真不少,但是是阿里的fastjson的我是没有找到合适的方法。这里用一个还...

9352
来自专栏大内老A

以上下文(Context)的形式创建一个共享数据的容器

在很多情况下我们具有这样的需求:为一组相关的操作创建一个执行上下文并提供一个共享的数据容器,而不是简单地定义一个全局变量,或者将数据通过参数传来传去。这样的上下...

2015
来自专栏AhDung

【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法

比如Json.NET的JObject明明实现了IEnumerable<T>,具体来说是IEnumerable<KeyValuePair<string, JTok...

1161
来自专栏技术之路

动态生成TreeView方法(一)

一般情况下生成TreeView我们用的是用递归不建议用递归数据量大了会慢, 小弟今天用SortedList集合实现一下没有技术含量,一看代码大家就会明白。个人也...

1866
来自专栏C# 编程

线程、委托、lambda运算符的简单示例

using System; using System.Collections.Generic; using System.Linq; using System...

2210
来自专栏菩提树下的杨过

几种常见复合sql查询语句的linq写法[继续补充中]

1.IN 语句 尝试了很多次,好象linq死活不生成in语句,无奈只能做了下变换 例,要找出"手机大类"以及"手机下属所有子类"的产品 (手机大类的ID为D0...

2376
来自专栏菩提树下的杨过

(Head First 设计模式)学习笔记(1)

把书中开篇duck问题的代码翻译成了c#版: 概述: 某游戏公司要设计一款鸭子的游戏,里面有各种各样的鸭子,有些会飞,有些会叫,但都会游泳。而且不同种类的鸭子...

2059
来自专栏大内老A

深入理解C# 3.x的新特性(1): Anonymous Type

在C#3.0中,引入了一个新的Feature:Anonymous Method,允许我们已Inline的方式来定义Delegate,为Developer在Cod...

3638

扫码关注云+社区

领取腾讯云代金券