请教如何动态生成js包含文件?

wtiancai 2005-09-07 03:19:19
获得页面所有的控件
根据控件的类型,去脚本配置文件匹配对应的脚本文件名,然后输出脚本文件
如果这个脚本文件已经生成那么则不必重复生成

配置文件类似
<?xml version="1.0" encoding="utf-8" ?>
<javaScript-reference>
<!-- 脚本文件对应的名称以及路径 -->
<file-name name="Table" src="js/Table.js"></file-name>
<file-name name="Input" src="js/Input.js"></file-name>
<file-name name="ControlUtils" src="js/ControlUtils.js"></file-name>
<file-name name="Utils" src="js/Utils.js"></file-name>
<file-name name="WebUtils" src="js/WebUtils.js"></file-name>
<!-- 脚本关联文件 -->
<file-reference name="Table">
<file-name name="ControlUtils"></file-name>
<file-name name="Utils"></file-name>
<file-name name="WebUtils"></file-name>
</file-reference>
<file-referenct name="Input">
<file-name name="ControlUtils"></file-name>
<file-name name="WebUtils"></file-name>
</file-referenct>
<!--控件-->
<component name="Table" class="" file-name=""></component>
<component name="ProlinkInput" class="" file-name=""></component>
</javaScript-reference>

最后能够自动在页面中生成类似
<script language="javascript" src="../js/Math.js" ></script>
<script language="javascript" src="../js/Utils.js"></script>
<script language="javascript" src="../js/DataSource.js"></script>
<SCRIPT language="javascript" src="../js/ControlUtils.js"></SCRIPT>
<script language="javascript" src="../js/Table.js"></script>
<script language="javascript" src="../js/Input.js"></script>
<script language="javascript" src="../js/BtnTextInput.js"></script>
<script language="javascript" src="../js/Label.js"></script>
<script language="javascript" src="../js/Lookup.js"></script>
<script language="javascript" src="../js/Body.js"></script>
<script language="javascript" src="../js/WebUtils.js"></script>
...全文
285 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
saucer 2005-09-08
  • 打赏
  • 举报
回复
is your aspx derived from deriving from CreateClientScriptBlock??

if not, either pass Page object to your static method or use the HttpContext.Current.Handler, for example

namespace ProlinkClass
{
/// <summary>
/// CreateClientScriptBlock 的摘要说明。
/// </summary>
public class CreateClientScriptBlock
{
private Page _page;

public CreateClientScriptBlock(Page p)
{
_page = p;
}


public CreateClientScriptBlock()
{
_page = (Page)System.Web.HttpContext.Current.Handler;
}


public void OutputScripts() { GetScriptFile(_page); }

prviate void GetScriptFile(Control c){
OutputScriptFile(c);
foreach(Control cc in c.Controls){
if (cc.ID != null){
GetScriptFile(cc);
}
}
}

private void OutputScriptFile(Control c){
string sTypeName = c.GetType().Name;
string sFileName = "";
if (sTypeName.Equals("Label"))
sFileName = "Label.js";
else if (sTypeName.Equals("TextBox"))
sFileName = "Input.js";

string sScript = "<script language=\"javascript\" src=\"../js/" + sFileName + "\"></script>";
if (!_page.IsClientScriptBlockRegistered(sTypeName)){
_page.RegisterClientScriptBlock(sTypeName,sScript);
}
}

}
}



then do in your aspx code behind:

new ProlinkClass.CreateClientScriptBlock(Page).OutputScripts();

wtiancai 2005-09-08
  • 打赏
  • 举报
回复
To saucer:

这个错误原因是我在方法前多加了static

那我请问一下如何在页面上调用这个类中的GetScriptFile()方法呢?

我是直接
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
BindData();
CreateClientScriptBlock(this);
}


出现如下错误:F:\MyCase\Asp.net\SCHOOL\Webs\Importer\PurchaseOrderAdd.aspx.cs(50): 'ProlinkClass.CreateClientScriptBlock' denotes a 'class' which is not valid in the given context
wtiancai 2005-09-08
  • 打赏
  • 举报
回复
我专门建一个类用于注册客户端脚本块
wtiancai 2005-09-08
  • 打赏
  • 举报
回复
error:

F:\MyCase\Asp.net\SCHOOL\ProlinkClass\CreateClientScriptBlock.cs(42): An object reference is required for the nonstatic field, method, or property 'System.Web.UI.Page.IsClientScriptBlockRegistered(string)'
F:\MyCase\Asp.net\SCHOOL\ProlinkClass\CreateClientScriptBlock.cs(43): An object reference is required for the nonstatic field, method, or property 'System.Web.UI.Page.RegisterClientScriptBlock(string, string)'


using System;
using System.Collections;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;

namespace ProlinkClass
{
/// <summary>
/// CreateClientScriptBlock 的摘要说明。
/// </summary>
public class CreateClientScriptBlock:System.Web.UI.Page
{
public CreateClientScriptBlock()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

private static void GetScriptFile(Control c){
OutputScriptFile(c);
foreach(Control cc in c.Controls){
if (cc.ID != null){
GetScriptFile(cc);
}
}
}

private static void OutputScriptFile(Control c){
string sTypeName = c.GetType().Name;
string sFileName = "";
if (sTypeName.Equals("Label"))
sFileName = "Label.js";
else if (sTypeName.Equals("TextBox"))
sFileName = "Input.js";

string sScript = "<script language=\"javascript\" src=\"../js/" + sFileName + "\"></script>";
if (!Page.IsClientScriptBlockRegistered(sTypeName)){
Page.RegisterClientScriptBlock(sTypeName,sScript);
}
}

}
}
wtiancai 2005-09-08
  • 打赏
  • 举报
回复
thanks
saucer 2005-09-07
  • 打赏
  • 举报
回复
or use Page.RegisterClientScriptBlock method or Page.RegisterStartupScript method, make sure you use

1. give different script different key

2. use Page.IsClientScriptBlockRegistered(ScriptKey) or Page.IsStartupScriptRegistered(ScriptKey) to check

saucer 2005-09-07
  • 打赏
  • 举报
回复
void GetScriptFile(Control c)
{
OutputScriptFile(c);
foreach(Control cc in c.Controls)
GetScriptFile(cc);
}


void OutputScriptFile(Control c)
{
//if (c is Label)
{
string sTypeName = c.GetType().Name;
if (!Page.IsClientScriptBlockRegistered(sTypeName))
{
Page.RegisterClientScriptBlock(sTypeName, String.Format("<script language="javascript" src="../js/{0}.js"></script>", sTypeName));
}
}
....
}

GetScriptFile(Page);
wtiancai 2005-09-07
  • 打赏
  • 举报
回复
我这样做是减少页面代码数量
因为各个控件对应的脚本包含文件不一样,有的控件可能包含几个脚本文件
所以采用动态生成,在后台根据页面控件数量及控件类型动态生成对应的脚本包含文件
gxboy 2005-09-07
  • 打赏
  • 举报
回复
这很简单啊 TypeName。感觉没必要。这种做法不通用的。你不是每个页面的每个控件都要用到脚本。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧