【问题标题】:Getting rid of Microsoft AJAX摆脱微软 AJAX
【发布时间】:2009-11-18 17:30:23
【问题描述】:

我们使用 Microsoft AJAX(cs 类 + js 类)编写了几个控件。现在我正在考虑摆脱它(只使用 jQuery),因为它很臃肿而且我们不使用 UpdatePanel。我的问题是:我应该如何更改我的控件?现在他们实现了 IScriptControl,它使用 Microsoft AJAX 功能(如果我理解正确的话,ScriptManager 和 ScriptControlDescriptor 类)。改用什么?

澄清。我不需要更多的 JavaScript 库——我已经在使用 jQuery 并且希望尽量减少额外的包含(除非它们真的很小)。我需要的是替换 ScriptManager 和 IScriptControl 接口。比如:

  1. 注册脚本引用(和 不复制它们)。
  2. 实例化与控件关联的脚本类。
  3. 将我的类绑定到 DOM 元素(顺便说一句,使用 jQuery 的最佳方法是什么?)。
  4. 正在初始化 JS 类字段。

【问题讨论】:

    标签: c# asp.net jquery asp.net-ajax


    【解决方案1】:

    另一方面,你可以试试 comet ajax 方法,查看these samples。

    【讨论】:

      【解决方案2】:

      好的,我终于完成了。

      1. 我们最终创建了 Page 后代,其中包含一些代码来替代脚本管理器(见下文)。我们使用控件的 Page 属性从控件的 OnPreRender 方法调用它。感谢http://dj.codeplex.com/ 的人提供了如何做到这一点的示例。

      2, 3, 4. 我们使用 jQuery.data 方法将脚本类的实例绑定到 DOM 元素。我们使用 jQuery.ready 方法执行实例化、初始化和绑定代码。此代码使用 AddScript 方法添加到其 Render 方法中的控件(见下文)。也许以后我们会使用 JavaScriptSerializer 将值从 C# 控件传递给 javascript 类,但目前我们是手动完成的,将参数传递给 javascript 类构造函数。

      HashSet<string> scriptReferences = new HashSet<string>();
      HashSet<string> cssReferences = new HashSet<string>();
      List<string> styles = new List<string>();
      
      public void AddScriptReference(string url, bool resolve)
      {
          string realUrl = url;
          if (resolve)
              realUrl = ResolveClientUrl(url);
      
          if (!scriptReferences.Contains(realUrl))
          {
              scriptReferences.Add(realUrl);
              Header.Controls.Add(
                  new LiteralControl(
                      "<script type='text/javascript' src='" +
                      realUrl + "'></script>"));
          }
      }
      
      public void AddCssReference(string url)
      {
          if (!cssReferences.Contains(url))
          {
              cssReferences.Add(url);
              HtmlLink link = new HtmlLink();
              //link.Href = ResolveClientUrl("~/jQuery-ui/css/ui-lightness/jquery-ui.css");
              link.Href = url;
              link.Attributes.Add("type", "text/css");
              link.Attributes.Add("rel", "stylesheet");
              Header.Controls.Add(link);
          }
      }
      
      public void AddCssStyle(string style)
      {
          styles.Add(style);
      }
      
      protected override void OnPreRenderComplete(EventArgs e)
      {
          base.OnPreRenderComplete(e);
          Header.Controls.Add(
              new LiteralControl(
                  "<style type='text/css'>" + styles.Join("\n") + "</style>"
              )
          );
      }
      
      public static void AddScript(HtmlTextWriter writer, string script,
          bool executeWhenReady)
      {
          writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/javascript");
          writer.RenderBeginTag(HtmlTextWriterTag.Script);
          if (executeWhenReady)
          {
              writer.Write("$(function(){\n");
          }
          writer.Write(script);
          if (executeWhenReady)
          {
              writer.Write("});\n");
          }
      
          writer.RenderEndTag();
      }
      

      【讨论】:

        【解决方案3】:

        jQuery 和 jQuery UI 非常强大。但您也可以使用 Moo Tools 和 Prototype。您正在使用 MS AJAX 中的哪些工具?开源的非 MS 产品几乎都有可比的东西。他们只需要你稍微多一点的劳动来实施。您还可以查看 Telerik 和 Syncfusions 控件。 Telerik 为 ASP.NET MVC 提供了一堆开源 ajax 产品,可以很容易地转换为 ASP.NET Web 表单。

        【讨论】:

          【解决方案4】:

          您可能对即将发布的 .NET4(以及 Visual Studio 2010)中更轻量级的条件渲染功能感兴趣

          http://msdn.microsoft.com/en-us/magazine/ee335716.aspx

          如果您可以等待,这对您来说可能是一个可行的解决方案。

          【讨论】:

          • 抱歉,我不明白它如何帮助我摆脱 ASP.NET AJAX。
          • 这解决了您所说的问题“它很臃肿,我们不使用 UpdatePanel”。新框架(如发布的链接中所述)解决了这些问题。
          【解决方案5】:

          如果您想严格使用 jQuery,我不确定您是否需要替换 IScriptControl 和 Scriptmanager。我建议你查看一些关于创建 jQuery 插件的 http://blog.jeremymartin.name/2008/02/building-your-first-jquery-plugin-that.html'>tutorials。

          【讨论】:

          • 在客户端(javascript)方面,我当然会创建插件。但我需要在代码的服务器(C#)端包含对 javascript 文件的引用并插入一些 JS 代码块。找到了ClientScriptManager,但是真的很不方便……
          猜你喜欢
          • 1970-01-01
          • 2010-11-03
          • 2012-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-02
          • 2011-01-23
          相关资源
          最近更新 更多