2009-11-18 29 views
2

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

CLARIFICATION。我不需要更多的JavaScript库 - 我已经在使用jQuery,并希望尽量减少附加内容(除非它们非常小)。我需要的是替换ScriptManager和IScriptControl界面。诸如:

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

回答

1

好吧,我终于完成了它。

  1. 我们最终创建了带有一些代码的Page Descendant来代替脚本管理器(见下文)。我们使用控件的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(); 
} 
0

jQuery和jQuery用户界面是非常强大的。但是你也可以使用Moo Tools和Prototype。您使用的是MS AJAX中的哪些工具?在开源非MS产品方面有很多可比的东西。他们只需要稍微多一些的劳动就可以实施。您也可以看看Telerik和Syncfusions控件。 Telerik为ASP.NET MVC提供了一堆开源的ajax产品,可以很容易地将其转换为ASP.NET Web Forms。

0

你可能有兴趣在.NET4即将发布的更加轻薄条件呈现的特征(与Visual Studio 2010中)

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

如果你能等待,它可能是一个可行的解决方案您。

+0

对不起,我不明白它将如何帮助我摆脱ASP.NET AJAX。 –

+0

这解决了你陈述的问题“它膨胀了,我们不使用UpdatePanel”。新框架(如发布的链接中所述)解决了这些问题。 –

0

我不知道你需要IScriptControl和ScriptManager的更换,如果你希望只使用jQuery的。我建议你检查一下创建jQuery插件的一些http://blog.jeremymartin.name/2008/02/building-your-first-jquery-plugin-that.html'>教程。

+0

在客户端(javascript)方面我当然会创建插件。但我需要在代码的服务器端(C#)中包含对JavaScript文件的引用并插入一些JS代码块。我发现ClientScriptManager,但它确实不方便... –

2

另一方面,您可以尝试彗星ajax的方法,检查these样本。