2008-12-03 30 views
3

this tutorial I am reading中,Dave Ward創建了一個頁面,該頁面顯示標籤中的服務器日期而不使用更新面板。如何將使用Ajax webmethods的ASP.NET頁面轉換爲啓用了Ajax的servercontrol?

我想了解如何創建使用ajax進行部分回發的servercontrol,其中控件中的方法是由同一控件生成的clientscript調用的,我認爲學習如何將此頁面轉換爲服務器控件將是幫助我瞭解什麼servercontrols使用,而不是webmethods公開他們的方法clientcript。

我完全按照文章所述創建了頁面,代碼隱藏和JavaScript,並獲得了示例工作。

於是,開始嘗試將其轉換爲一個servercontrol,我搬到戴夫的JavaScript的網頁到一個文件中,〜測試/ JScript.js:

function UpdateTime() { 
    PageMethods.GetCurrentDate(OnSucceeded, OnFailed); 
} 

function OnSucceeded(result, userContext, methodName) { 
    $get('Literal1').innerHTML = result; 
} 

function OnFailed(error, userContext, methodName) { 
    $get('Literal1').innerHTML = "An error occured."; 
} 

並把下面的類,我App_Code文件:現在

namespace foo 
{ 
    /// <summary> 
    /// Summary description for ServerControlTest 
    /// </summary> 
    public class ServerControlTest : CompositeControl, IScriptControl 
    { 
     ScriptManager sm; 
     protected override void OnPreRender(EventArgs e) 
     { 
      if (!this.DesignMode) 
      { 
       // Test for ScriptManager and register if it exists 
       sm = ScriptManager.GetCurrent(Page); 

       if (sm == null) 
        throw new HttpException("A ScriptManager control must exist on the current page."); 

       sm.RegisterScriptControl(this); 
       sm.EnablePageMethods = true; 
      } 

      base.OnPreRender(e); 
     } 

     protected override void OnLoad(EventArgs e) 
     { 
      Literal lit = new Literal(); 
      lit.Text = "<span ID=\"Literal1\" runat=\"server\">test</span><input id=\"Button1\" type=\"button\" value=\"button\" onclick=\"UpdateTime();\" />"; 

      this.Controls.Add(lit); 
     } 
     protected override void Render(HtmlTextWriter writer) 
     { 
      if (!this.DesignMode) 
       sm.RegisterScriptDescriptors(this); 

      base.Render(writer); 
     } 

     [WebMethod] 
     public static string GetCurrentDate() 
     { 
      return DateTime.Now.ToString(); 
     } 

     #region IScriptControl Members 

     IEnumerable<ScriptDescriptor> IScriptControl.GetScriptDescriptors() 
     { 
      return null; 
     } 

     IEnumerable<ScriptReference> IScriptControl.GetScriptReferences() 
     { 
      ScriptReference reference = new ScriptReference(); 
      reference.Path = ResolveClientUrl("~/tests/JScript.js"); 

      return new ScriptReference[] { reference }; 
     } 

     #endregion 
    } 
} 

,在我的示例中,只要按一下按鈕,我得到這個錯誤: PageMethods沒有定義 [打破這個錯誤] PageMethods.GetCurrentDate(OnSucceeded,OnFailed);

如何從我的控件註冊的clientscript中調用GetCurrentDate?

回答

2

從v3.5開始,實際上還沒有針對服務器控件的方法實現AJAX回調的完全封裝方法。這是一個非常令人沮喪的限制。

最常見的解決方案是在服務器控件的程序集中創建一個HttpHandler,然後要求該處理程序在web.config中註冊。例如,查看ASP.NET AJAX的ScriptResource.axd如何在ASP.NET AJAX 1.0的web.config中進行連接。

+0

謝謝你的答案,戴夫。我感到沮喪,想知道我錯過了什麼。到目前爲止,博客上的所有內容都對我有所幫助。 – NetHawk 2008-12-03 17:46:07

相關問題