从自定义控件编写JavaScript

时间:2009-07-01 00:24:47

标签: asp.net

我是编写自定义控件的新手。我有MyCustomControl.cs,在我的Render方法中,我想渲染大约50行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的最佳实践或常用方法是什么? (我这里不是在谈论用户控件!!,自定义控件/ Class!)

在查看来源时,我还希望在客户端上吐出/呈现时保留任何缩进以便于阅读。

1 个答案:

答案 0 :(得分:0)

我提供的答案只是考虑定期回发。可以使用ScriptManager及其各自的方法应用以下所有方法来执行相同的操作。

有几种方法可以做到这一点。您可以加载Web资源并引用它

// 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文件。我使用Yahoo!的YuiCompressor!但是还有其他几个。

你还应该投入一些时间来研究使用JavaScript框架(如jQuery)来完成大量繁琐的工作。这就是现在。我可能稍后再添加一些,但这些是我现在的智慧之词。