ASP网站制作之在C#中挪用VBScript、javascript等...
缺乏可以共同遵循的行业标准,ASP还处在发展初期,大家对它的理解不同,如产品和服务标准,收费标准等,不利于行业的健康发展。vbscript|剧本 在C#中挪用VBScript、JavaScript等剧本的完成作者:秋枫
之前在唱工作流(workflow)项目标时分,外面有一项就是在用户制订流程界说时可以编写剧本来掌握举动的跳转,而这些剧本界说后存在数据库中,当流程启动的时分,任务流引擎会掌握举动履行按次,串型的两个举动对照复杂,但有的举动到下一个举动有前提判别,或存在多个分支,复杂的还好,只需在数据库表中加个字段就能够完成,庞杂一点的就需求经由过程剧本完成了。事先经历不敷,几天都没找到疾速的处理举措,想本人写一个自界说剧本引擎没有掌控,并且工夫也不敷,仍是在网上找找看吧,花了一些工夫,仍是找到了一个自以为对照好的处理举措,写出来同人人分享。
上面经由过程两局部来讲明完成和使用。
一.利用MSScriptControl
到微软的网站高低载Windows Script Control,它是一个ActiveX(R) 控件,所以在.NET中利用我Interop了一下。下载装置完成后,新建一个C#的Windows使用法式项目,在处理计划资本办理器当选中援用节点,右键点击选择添加援用菜单,弹出添加援用对话框,单击阅读找到装置Windows Script Control的目次,拔取msscript.ocx文件肯定。那末在援用节点下会增添一个MSScriptControl组件,上面是他Interop后的一切对象。
ScriptControl 对撑持 ActiveX(TM) Script 的宿主 Script 引擎供应复杂接口。接上去咱们对被转化成ScriptControlClass类的ScriptControl的属性和办法停止一些申明。
属性
AllowUI 属性:使用于 ScriptControl 自己或 Scirpt 引擎显示的用户界面元素,可读写。
CodeObject 属性:前往对象,该对象用于挪用指定模块的公用成员。只读。
Error 属性:前往 Error 对象,个中包括所产生的最初一个毛病的相干具体信息。只读。
Language 属性:设置或前往正在利用的 Script 言语称号。可读写。
Modules 属性:为 ScriptControl 对象前往模块纠合。只读。
Procedures 属性:前往在指定模块中界说的进程纠合。只读。
SitehWnd 属性:设置或前往窗口的 hWnd,经由过程履行 Script 代码,此窗口用于显示对话框和其他用户界面元素。可读写。
State 属性:设置或前往 ScriptControl 对象的形式。可读写。
Timeout 属性:设置或前往工夫(毫秒),此工夫后用户可选择中断 Script 代码的履行或答应代码持续履行。可读写。
UseSafeSubset 属性:设置或前往 Boolean 值,指明宿主使用法式是不是有保密性请求。假如宿主使用法式需求平安掌握,则 UseSafeSubset 为 True,不然为 False。可读写。
办法
AddCode 办法:向模块添加指定代码。可屡次挪用 AddCode 办法。
AddObject 办法:使主机对象模子对 Script 引擎可用。
Eval 办法:盘算表达式并前往了局。
ExecuteStatement 办法:履行指定的语句。
Reset 办法:保持一切已添加到 ScriptControl 中的 Script 代码和对象。
Run 办法:运转指定进程。
事务
Error 事务:呈现运转时毛病时,产生此事务。
Timeout 事务:当超越了 Timeout 属性指定的工夫且用户在了局对话框当选定了 End 时,产生此事务。
增补几点
AllowUI 属性假如设置为false,则显示对话框之类的语句不起感化,如在 VBScript 中MsgBox 语句,JavaScript中的alert等,而且假如履行的剧本超越TimeOut设置的毫秒数,也不会跳出超越工夫提示的对话框,反之则相反;从头设置 Language 属性会清空AddCode加载的代码;关于TimeOut属性,产生超不时,ScriptControl 反省对象的 AllowUI 属性,肯定是不是答应显示用户界面元素。
假如读者需求更具体的懂得,可以检查MSDN文档。
为了使控件更轻易利用,我用一个ScriptEngine类包装了一下,上面是完全代码:
using System;
using MSScriptControl;
using System.Text;
namespace ZZ
{
/// <summary>
/// 剧本类型
/// </summary>
public enum ScriptLanguage
{
/// <summary>
/// JScript剧本言语
/// </summary>
JScript,
/// <summary>
/// VBscript剧本言语
/// </summary>
VBscript,
/// <summary>
/// JavaScript剧本言语
/// </summary>
JavaScript
}
/// <summary>
/// 剧本运转毛病代办署理
/// </summary>
public delegate void RunErrorHandler();
/// <summary>
/// 剧本运转超时期理
/// </summary>
public delegate void RunTimeoutHandler();
/// <summary>
/// ScriptEngine类
/// </summary>
public class ScriptEngine
{
private ScriptControl msc;
//界说剧本运转毛病事务
public event RunErrorHandler RunError;
//界说剧本运转超时势件
public event RunTimeoutHandler RunTimeout;
/// <summary>
///机关函数
/// </summary>
public ScriptEngine():this(ScriptLanguage.VBscript)
{
}
/// <summary>
/// 机关函数
/// </summary>
/// <param name="language">剧本类型</param>
public ScriptEngine(ScriptLanguage language)
{
this.msc = new ScriptControlClass();
this.msc.UseSafeSubset = true;
this.msc.Language = language.ToString();
((DScriptControlSource_Event)this.msc).Error += new DScriptControlSource_ErrorEventHandler(ScriptEngine_Error);
((DScriptControlSource_Event)this.msc).Timeout += new DScriptControlSource_TimeoutEventHandler(ScriptEngine_Timeout);
}
/// <summary>
/// 运转Eval办法
/// </summary>
/// <param name="expression">表达式</param>
/// <param name="codeBody">函数体</param>
/// <returns>前往值object</returns>
public object Eval(string expression,string codeBody)
{
msc.AddCode(codeBody);
return msc.Eval(expression);
}
/// <summary>
/// 运转Eval办法
/// </summary>
/// <param name="language">剧本言语</param>
/// <param name="expression">表达式</param>
/// <param name="codeBody">函数体</param>
/// <returns>前往值object</returns>
public object Eval(ScriptLanguage language,string expression,string codeBody)
{
if(this.Language != language)
this.Language = language;
return Eval(expression,codeBody);
}
/// <summary>
/// 运转Run办法
/// </summary>
/// <param name="mainFunctionName">进口函数称号</param>
/// <param name="parameters">参数</param>
/// <param name="codeBody">函数体</param>
/// <returns>前往值object</returns>
public object Run(string mainFunctionName,object[] parameters,string codeBody)
{
this.msc.AddCode(codeBody);
return msc.Run(mainFunctionName,ref parameters);
}
/// <summary>
/// 运转Run办法
/// </summary>
/// <param name="language">剧本言语</param>
/// <param name="mainFunctionName">进口函数称号</param>
/// <param name="parameters">参数</param>
/// <param name="codeBody">函数体</param>
/// <returns>前往值object</returns>
public object Run(ScriptLanguage language,string mainFunctionName,object[] parameters,string codeBody)
{
if(this.Language != language)
this.Language = language;
return Run(mainFunctionName,parameters,codeBody);
}
/// <summary>
/// 保持一切已添加到 ScriptControl 中的 Script 代码和对象
/// </summary>
public void Reset()
{
this.msc.Reset();
}
/// <summary>
/// 获得或设置剧本言语
/// </summary>
public ScriptLanguage Language
{
get{return (ScriptLanguage)Enum.Parse(typeof(ScriptLanguage),this.msc.Language,false);}
set{this.msc.Language = value.ToString();}
}
/// <summary>
/// 获得或设置剧本履行工夫,单元为毫秒
/// </summary>
public int Timeout
{
get{return this.msc.Timeout;}
set{this.msc.Timeout = value;}
}
/// <summary>
/// 设置是不是显示用户界面元素
/// </summary>
public bool AllowUI
{
get{return this.msc.AllowUI;}
set{this.msc.AllowUI = value;}
}
/// <summary>
/// 宿主使用法式是不是有保密性请求
/// </summary>
public bool UseSafeSubset
{
get{return this.msc.UseSafeSubset;}
set{this.msc.UseSafeSubset = true;}
}
/// <summary>
/// RunError事务激起
/// </summary>
private void OnError()
{
if(RunError!=null)
RunError();
}
/// <summary>
/// OnTimeout事务激起
/// </summary>
private void OnTimeout()
{
if(RunTimeout!=null)
RunTimeout();
}
private void ScriptEngine_Error()
{
OnError();
}
private void ScriptEngine_Timeout()
{
OnTimeout();
}
}
}
下面的包装界说了一个ScriptLanguage列举,如许操作起来更便利一点。别的剧本引擎包含了Error事务和Timeout事务,依据实践利用情形可停止注册。
二.剧本引擎演示
我建了个窗体法式,测试包含剧本言语的选择,是不是开启AllowUI属性,超不时间的设置,和剧本引擎挪用办法的选择。测试法式代码对照长,上面列出了次要局部:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace ZZ
{
public class Form1 : System.Windows.Forms.Form
{
private ScriptEngine scriptEngine;
private System.Windows.Forms.CheckBox checkBoxAllowUI;
private System.Windows.Forms.TextBox textBoxResult;
private System.Windows.Forms.NumericUpDown numericUpDownTimeout;
private System.Windows.Forms.TextBox textBoxCodeBody;
private System.Windows.Forms.Button buttonRun;
private System.Windows.Forms.Button buttonCancel;
private System.Windows.Forms.ComboBox comboBoxScript;
private System.Windows.Forms.TextBox textBoxParams;
private System.Windows.Forms.RadioButton radioButtonEval;
private System.Windows.Forms.RadioButton radioButtonRun;
private System.Windows.Forms.TextBox textBoxMethodName;
private System.ComponentModel.Container components = null;
public Form1()
{
InitializeComponent();
this.comboBoxScript.SelectedIndex = 0;
this.scriptEngine = new ScriptEngine();
this.scriptEngine.UseSafeSubset = true;
this.scriptEngine.RunError += new RunErrorHandler(scriptEngine_RunError);
this.scriptEngine.RunTimeout += new RunTimeoutHandler(scriptEngine_RunTimeout);
}
protected override void Dispose( bool disposing )
{
if( disposing )
if (components != null)
components.Dispose();
base.Dispose( disposing );
}
#region Windows 窗体设计器生成的代码
private void InitializeComponent()
{
//省略
}
#endregion
static void Main()
{
Application.Run(new Form1());
}
//运转剧本
private void buttonRun_Click(object sender, System.EventArgs e)
{
this.scriptEngine.Reset();
this.scriptEngine.Language = (ScriptLanguage)Enum.Parse(typeof(ScriptLanguage),this.comboBoxScript.SelectedItem.ToString());
this.scriptEngine.Timeout = (int)this.numericUpDownTimeout.Value;
this.scriptEngine.AllowUI = this.checkBoxAllowUI.Checked;
if(this.radioButtonEval.Checked)//履行Eval办法
{
this.textBoxResult.Text = this.scriptEngine.Eval(this.textBoxMethodName.Text+"("+this.textBoxParams.Text+")",this.textBoxCodeBody.Text).ToString();
}
else//履行Run办法
{
string[] parameters = (string[])this.textBoxParams.Text.Split(',');
object [] paramArray = new object;
for(int i = 0;i<parameters.Length;i++)
paramArray = Int32.Parse(parameters);
this.textBoxResult.Text = this.scriptEngine.Run(this.textBoxMethodName.Text,paramArray,this.textBoxCodeBody.Text).ToString();
}
}
//加入法式
private void buttonCancel_Click(object sender, System.EventArgs e)
{
this.Close();
}
//毛病函数
private void scriptEngine_RunError()
{
MessageBox.Show("RunError履行剧本毛病!");
}
private void scriptEngine_RunTimeout()
{
MessageBox.Show("RunTimeout履行剧本超时,激发毛病!");
}
}
}
上面是测试法式运转界面:
在文本框中写了一个JavaScript的函数。输出12,输入12000012。
假如把超不时间调剂为1毫秒,那末履行该剧本就会跳出上面的超时提示框,同时激起事务。
由于ASP还是一种Script语言所没除了大量使用组件外,没有办法提高其工作效率。它必须面对即时编绎的时间考验,同时我们还不知其背后的组件会是一个什么样的状况; 代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。 我想问如何掌握学习节奏(先学什么再学什么)最好详细点? ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp),它可以看作是VC和Java的混合体吧。 Request:从字面上讲就是“请求”,因此这个是处理客户端提交的东东的,例如Resuest.Form,Request.QueryString,或者干脆Request("变量名") 我认为比较好的方法是找一些比较经典的例子,每个例子比较集中一种编程思想而设计的。 在平时的学习过程中要注意现学现用,注重运用,在掌握了一定的基础知识后,我们可以尝试做一些网页,也许在开始的时候我们可能会遇到很多问题,比如说如何很好的构建基本框架。 Session:这个存储跟客户端会话过程的数据,默认20分钟失效 最近在学asp,不要问我为什么不直接学.net,因为公司网站是asp做的所以有这个需要,卖了本书asp入门到精通,对里面的六大内置对象老是记不住,还有很多属性和方法看的头晕。 ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码,能产生和执行动态、交互式、高效率的站占服务器的应用程序。 下面简单介绍一下我学习ASP的方法,希望对想学习ASP的朋友有所帮助... 从事这个行业,那么你可以学ASP语言,简单快速上手,熟练dreamweav排版,写asp代码,熟练photoshop处理图片,打好基础就行了 我们必须明确一个大方向,不要只是停留在因为学而去学,我们应有方向应有目标. ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码,能产生和执行动态、交互式、高效率的站占服务器的应用程序。 我想问如何掌握学习节奏(先学什么再学什么)最好详细点? 我可以结合自己的经验大致给你说一说,希望对你有所帮助,少走些弯路。 Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点) 虽然ASP也有很多网络教程。但是这些都不系统。都是半路出家,只是从一个例子告诉你怎么用。不会深入讨论,更不会将没有出现在例子里的方法都一一列举出来。 代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
页:
[1]