2009-07-01 82 views
0

我是新編寫自定義控件。我有MyCustomControl.cs,在我的Render方法中,我想渲染大約50行JavaScript。做這件事的最好方法是使用作者?從自定義控件編寫JavaScript

protected override void Render(HtmlTextWriter writer) 
     { 
      writer.write(@"<script type....rest of opening tag here"); 

      writer.Write(@" 
          function decode(s) 
          { 
           return s.replace(/&amp;/g, ""&"") 
           .replace(/&quot;/g, '""') 
           .replace(/&#039;/g, ""'"") 
           .replace(/&lt;/g, ""<"") 
           .replace(/&gt;/g, "">""); 
          };" 
      ); 

我打算再多加6個writer.Write寫出更多的章節。這是在這個莊園中實際執行JavaScript編寫的最佳方法嗎?

或者我應該使用ClientScript.RegisterClientScriptBlock?那麼人們在自定義控件中編寫javascript的最佳做法或常見方式是什麼? (我不是在談論一個用戶控件在這裏!,自定義控制/班!)

我也想保留任何縮進可讀性一旦它吐出/收視源時,呈現在客戶端上。

回答

0

我提供的只是把常規的回發到答案。以下所有可以使用ScriptManager及其相應的方法來應用。

有幾個方法可以做到這一點。您可以加載網絡資源並參考它

// The Scripts namespace in this case would actually be a physical folder in your YourNamespace.CustomControlsNamespace 
// namespace. 
// Also the /Scripts/YourJavaScriptFile.js needs to have it's Build Action property set to Embedded Resource 
[assembly: WebResource("YourNamespace.CustomControlsNamespace.Scripts.YourJavaScriptFile.js", "text/javascript")] 
namespace YourNamespace.CustomControlsNamespace 
{ 
    public CustomControl() 
    { 
     ... 
    } 

    ... 

    protected override OnPreRender(EventArgs e) 
    { 
     ... 

     Type type = typeof(CustomControl); 
     string scriptUrl = Page.ClientScript.GetWebResourceUrl(type, "Acuity.Web.UI.WebControls.Scripts.accdaterange.js"); 
     string key = "yourKey"; 


       if (!Page.ClientScript.IsClientScriptIncludeRegistered(type, key)) 
       { 
        control.Page.ClientScript.RegisterClientScriptInclude(type, key, scriptUrl); 
       } 

       ... 
    } 

    ... 
} 

您還可以在自定義控件中引用外部腳本。

namespace YourNamespace.CustomControlsNamespace 
{ 
    public CustomControl() 
    { 
     ... 
    } 

    ... 

    protected override OnPreRender(EventArgs e) 
    { 
     ... 

     Type type = typeof(CustomControl); 
     string scriptUrl = Page.ResolveClientUrl("~/yourScriptsFolder/yourExternalScript.js"); 
     string key = "yourKey"; 


       if (!Page.ClientScript.IsClientScriptIncludeRegistered(type, key)) 
       { 
        control.Page.ClientScript.RegisterClientScriptInclude(type, key, scriptUrl); 
       } 

       ... 
    } 

    ... 
} 

取決於你想要打包它。嵌入式資源的優勢在於,您可以保證此腳本始終處於您的自定義控件所在的程序集中。您很可能必須添加一些內聯JavaScript來連接自定義控件。嘗試儘可能少地做到這一點。您可以使用Page.ClientScript.RegisterClientScriptBlock(...)來完成此操作。您還希望避免硬編碼腳本中自動生成的客戶端ID。它們應該作爲參數傳遞給客戶端對象。

而且,一旦一切看起來不錯,你應該壓縮/再壓縮你的外部JavaScript文件。我使用雅虎的YuiCompressor。但還有其他幾個人。

你也應該投資一些時間到考慮使用JavaScript框架如jQuery做很多繁重的工作。現在就是這樣。我稍後可能會補充一些,但這些是我現在的智慧話語。

+0

我們不需要回傳。我只是吐出jQuery和一些常規的JavaScript以及一系列值。我將使用這些值的數組將JSON調用回到.ashx處理程序,以便獲取一些數據來填充該jQuery控件。 – PositiveGuy 2009-07-01 12:06:05