[探讨] 简单的 ASP MVC 开发模式。

Rimifon 2021-04-02 10:40:39
代码仅实现了 MVC模式和 json处理,算不上是框架,只是探讨这种模式是否有助于理清开发思路。
实现了 模块化,web 和 api 分开处理,提供 API 调试页面。
<%@ Language="JavaScript" codepage="65001" %><%
// 引导
function boot() {
var route = (Request.QueryString("r").Item || "").split("/");
var model = getModel(route), c = 0;
while(true) {
var op = (route[c++] || "List").toLowerCase();
if(!model[op]) return tojson({ err: "403 Object Not Found" });
if("function" != typeof model[op]) { model = model[op]; continue; }
var rs = model[op]();
return rs instanceof Object ? tojson(rs) : rs;
}
}

// 模块定义
function getModel(route) {
// 展示 API 接口调试界面
var showApi = function(apipath) {
if(!apipath) apipath = "Api";
sys.apipath = "?r=" + (Request.QueryString("r").item || "").replace(/\w+$/, "") + apipath + "/";
// 可以从此处下载:http://boomstone.net/AspLib/views/apidoc.html
%><!-- #include virtual="/AspLib/views/apidoc.html" --><%
};
var root = {
// 分类模块
cata: {
api: {
Memo: [ "分类", "既可 ajax 调用,也可 通过 this.api 调用。" ],
ListDoc: [ "分类列表", "", "?r=Cata/Api/List" ],
list: function() { return { rows: new Array }; },
ShowDoc: [ "分类查看" ],
show: function() { return { title: "来自查看接口数据" }; },
SaveDoc: [ "分类保存" ],
save: function() { return { msg: "Save OK." }; },
DropDoc: [ "分类删除" ],
drop: function() { return { msg: "Drop OK." }; }
},
list: function() {
var rs = this.api.list();
return "此处 include 分类列表模板页面: " + tojson(rs);
},
// ?r=Cata/Show/5
show: function() {
var rs = this.api.show();
return "Cata Show ID[" + ~~route[2] + "]: " + tojson(rs);
},
// ?r=Cata/ApiDoc
apidoc: function() { return showApi.call(this.api); }
},
// 信息模块
info: {
api: {
list: function() { return { rows: new Array }; },
show: function() { return new Object; },
save: function() { return { msg: "Save OK." }; },
drop: function() { return { msg: "Drop OK." }; }
},
list: function() { return "Info List"; },
show: function() { return "Info Show"; },
apidoc: function() { return showApi.call(this.api); }
}
}
return root;
}

// 全局函数定义
function tojson(str) {
if(sys.JSON) return sys.JSON.stringify(str);
return getJson().stringify(str);
}

function fromjson(str) {
if(sys.JSON) return sys.JSON.parse(str);
return getJson().parse(str);
}

function getJson() {
var doc = new ActiveXObject("htmlfile");
doc.write("<meta http-equiv='X-UA-Compatible' content='IE=edge' />");
return sys.JSON = doc.frames.JSON;
}

var sys = new Object;
Response.Write(boot());
%>
...全文
596 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hookee 2021-04-08
  • 打赏
  • 举报
回复
wsc可以不需要注册,直接 Set Model = GetObject("script:" & sPrjPath & "action\" & oAction("type") & ".wsc") 这样调用
horizon_zpy 2021-04-08
  • 打赏
  • 举报
回复
谢谢楼上分享。wsc能够直接注册不编译还是很强的,直接php com就可以调用。
hookee 2021-04-07
  • 打赏
  • 举报
回复
前提是不用模板的话, 在控制器最后 可以用 Server.Transfer "view.asp" 转到view页面,此时业务数据要传到view.asp,就需要借助session了。
Rimifon 2021-04-07
  • 打赏
  • 举报
回复
Server.Transfer确实能解决一个问题,就是动态按需加载脚本,可惜asp设计之初就只是简单的将处理转交另一个重新开始的线程,没做数据传递,否则真是一个完美实现View的方法。我现在用include的方法来实现View,效果很不错,缺点就是不是动态加载的。
wsc可以右键直接注册成“Xxxx.Xxxxx”格式的COM组件供其他语言调用,而不需要编译成dll。
wsc虽然以接口的方式调用,会有些性能损耗,但也不是特别明显,wsc和wsc之间也是可以相互引用的,不过大多数情况下没有这种必要。
amuie 2021-04-07
  • 打赏
  • 举报
回复
引用 3 楼 Rimifon 的回复:
wsc用来做组件是个不错的选择,用来做模块管理就不是很合适,例如栏目模块和文章模块的增删改查。View数据交互也不需要借助第三方组件呀,asp本身就是个模板语言,一楼例子的showApi就是输出view的一种很简单的形式,数据交互完全没问题。
wsc文件之间class类不能互通。没什么用。等于一个方法有时候要写很多遍。其次wsc很吃资源。服务器配置差的情况下。同样代码执行效率反而低很多
horizon_zpy 2021-04-07
  • 打赏
  • 举报
回复
e=引用 8 楼 Rimifon 的回复:]是的,后缀也可以是 .sct,好像没看到他们有多大区别,就是一个标签是 <component>,一个标签是 <scriptlet>,脚本部件的优势是,封装成组件后,可以作为ActiveX控件供其他语言使用,例如 C#,Delphi,甚至 php中也能调用脚本部件。但是,如果真把业务处理封装到 wsc 里头,让 php来调用,是不是很另类的一个存在。[/quote]
compo

引用 8 楼 Rimifon 的回复:
是的,后缀也可以是 .sct,好像没看到他们有多大区别,就是一个标签是 <component>,一个标签是 <scriptlet>,脚本部件的优势是,封装成组件后,可以作为ActiveX控件供其他语言使用,例如 C#,Delphi,甚至 php中也能调用脚本部件。但是,如果真把业务处理封装到 wsc 里头,让 php来调用,是不是很另类的一个存在

component 可以php,component就是active x,需要vb6编译成dll吧?
hookee 2021-04-05
  • 打赏
  • 举报
回复
用getscript直接调用wsc,不用注册,很适合分类处理业务逻辑。采用基于约束的开发,路由都可以不配,控制器直接读取文件。
不是view本身,是数据传递到view,简单的方法只能借助session,但存放在session的组件的线程模型受限,比如自带的字典对象就不合适,借助第三方才行。 复杂点,用模板,读取模板,+ json 数据再输出。
Rimifon 2021-04-05
  • 打赏
  • 举报
回复
是的,后缀也可以是 .sct,好像没看到他们有多大区别,就是一个标签是 <component>,一个标签是 <scriptlet>,脚本部件的优势是,封装成组件后,可以作为ActiveX控件供其他语言使用,例如 C#,Delphi,甚至 php中也能调用脚本部件。但是,如果真把业务处理封装到 wsc 里头,让 php来调用,是不是很另类的一个存在
Rimifon 2021-04-05
  • 打赏
  • 举报
回复
数据传递到 view 只能借助 Session 这个,可以举个例子?没看明白是个什么操作。
horizon_zpy 2021-04-05
  • 打赏
  • 举报
回复
http://aspalliance.com/414_Windows_Scripting_Components_WSC_in_ASP
wsc是指这个组件吗?
hookee 2021-04-03
  • 打赏
  • 举报
回复
模块可以用asp直接调用wsc。// 直接输出json没什么太大问题。如果是通过view输出,数据传到view 在asp里多少有点问题,只能借助第三方组件。
Rimifon 2021-04-03
  • 打赏
  • 举报
回复
在方法内直接 include HTML模版,就是输出view,html里面可以使用asp的模板语法调用方法内的变量。
Rimifon 2021-04-03
  • 打赏
  • 举报
回复
wsc用来做组件是个不错的选择,用来做模块管理就不是很合适,例如栏目模块和文章模块的增删改查。View数据交互也不需要借助第三方组件呀,asp本身就是个模板语言,一楼例子的showApi就是输出view的一种很简单的形式,数据交互完全没问题。
Rimifon 2021-04-02
  • 打赏
  • 举报
回复
所有功能都写一级路由,和分模块不限深度的路由对比,哪种更合适?感觉各有优缺点。小一点的项目,一级路由应该够了。大一点的项目,分模块比较合适,但 ASP 这种语言,感觉大一点的项目更适合用新的asp文件去做不同模块

28,409

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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