2010-08-06 64 views
0

我目前正在转换旧的“Web 1.0”代码以符合当前的标准。在ASP/VB.NET上生成/注册客户端脚本

有没有更好的方式来生成和附加客户端脚本,而不是将过多的行添加到StringBuilder,然后通过ClientScript.RegisterStartupScript(Me.GetType(), "startUpScript", strScript)将其注册到页面?

有没有其他的方法(除了把所有这些放到一个全局的.js文件中)这个例子可以改进?如果将其包含在主.js文件中是“最佳实践”选项,那为什么?

Dim lsbScript As New Text.StringBuilder 

    lsbScript.Append(vbCrLf) 
    lsbScript.Append("<script language=""javascript>""" & vbCrLf) 
    lsbScript.Append("<!--" & vbCrLf) 

    ... 

    lsbScript.Append("//-->" & vbCrLf) 
    lsbScript.Append("</SCRIPT>" & vbCrLf) 


    If Not ClientScript.IsStartupScriptRegistered("someScript") Then 
     ClientScript.RegisterStartupScript(Me.GetType(), "someScript", lsbScript.ToString) 
    End If 

回答

1

一个好的中间地带可能会将脚本内容卸载到一个新的js文件中,并且包含来自代码隐藏的脚本节点。

protected void Page_Load(object sender, EventArgs e) { 

    bool someCondition = Whatever(); 
    if (someCondition) 
    { 
     System.Web.UI.HtmlControls.HtmlGenericControl script; 
     script = new System.Web.UI.HtmlControls.HtmlGenericControl("script"); 
     script.Attributes["src"] = "myscript.js"; 
     this.Controls.Add(script); 
    } 
} 

这只会将节点放在页面的末尾。或者,您可以在页面上放置占位符控件,并将新的HtmlGenericControl添加到该页面。

(对不起,vb不是我的母语)。

0

是的,你可以在你的项目中包含一个.js文件。设置它的生成操作(右键单击项目浏览器中的文件),以嵌入的资源

例如:common.js

以上服务器控件的命名空间(或徘徊无论你需要它):

[assembly: System.Web.UI.WebResource(
    "MyFullNameSpace.Common.js", 
     "text/javascript", PerformSubstitution = true)] 

的OnPreRender事件:

if (!Page.ClientScript.IsClientScriptIncludeRegistered("Common")) 
       { 
        string url = Page.ClientScript.GetWebResourceUrl(this.GetType(), "MyFullNameSpace.Common.js"); 
        Page.ClientScript.RegisterClientScriptInclude("Common", url); 
       } 

谨防与.JS位于其中的完整,准确的命名空间,以取代MyFullNameSpace。如果它不工作可能.net无法找到它,你可以使用反射器来打开你的DLL,并找到.js作为嵌入式资源,所以你会知道它的确切名称空间。

我总是这样做服务器控件,但我的形象也可以在Web应用程序项目中完成。

+0

我很清楚我可以添加一个.js文件到一个项目;这只是因为我们的.js文件已经陷入其他功能,所以我正在寻找替代方案,只有当页面(在特定条件下)需要它时,才能动态地向页面添加脚本。 – danyim 2010-08-06 15:26:55

+0

因此,您制作serveral.js文件并根据需要注册它们? 您可以从代码中将参数传递给.js文件中的函数。 – Jeroen 2010-08-06 15:28:55

0

使用AppendLine()代替连接vbCrLf可以获得一点点的里程数。

+0

感谢您的提示。我只是在复制和粘贴旧代码。 – danyim 2010-08-06 15:28:12