我一直试图在基于VBScript(ASP Classic)的系统上实现前端控制器几天。我来自ASP.NET MVC和Java背景,其中MVC实现很常见,主要由现有框架完成。然而,在VBScript上,这方面几乎没有做任何事情,所以这就是我自己尝试做的原因。我使用this和this文章作为如何实施它的指南。
我起初相信我需要为每个请求定义一些常量参数,所以我创建了3:
class_command 'which command responsible to execute the correct class handler
action 'which method of the class handler to execute
action_params 'which parameters the action will need
接下来,我定义了一个用于处理请求的通用控制器处理程序:
Public Function Controller_Handler(action_params)
它的任务是提取常量参数(class_command
,action
,action_params
)并处理任何错误(我稍后会添加一个过滤器来处理它)就像缺少常量参数或身份验证问题一样。
但很快我意识到了一个问题:处理程序如何知道要调用哪个命令,因为请求是一个字符串?我不能简单地使用反射将其转换为类,因为VBScript(我认为)没有反射库或内置功能。</ p>
所以我想我可以像这样创建一个Switch Case
:
Select action_Params.Item("action_params")
Case "command_A"
' Call Command A
Case "command_B"
' Call Command_B
.
.
.
Case "Command_X"
' And so on
End Select
但这样做有点过程式。接下来我想到了创建一个XML文件,它将映射所有命令和其他东西。
所以我的问题是:考虑到VBScript限制,这是实现Front Controlller模式的好方法吗?如果没有,你能提供一个指导(希望有一些例子,甚至是简单的例子),我该怎么办?
答案 0 :(得分:1)
从经典转到.net / mvc我可以分享我在经典asp中所做的事情,试图尽可能地模仿这种行为,而不会造成太多的维护问题。
在IIS中使用URL Rewrite是我的routes
。我通常只做一个路由并将所有入站请求直接/重写到一个controller.asp
页面以简化操作,并且没有一堆规则和控制器重定向直接在我的URL重写设置中以便于维护(对我而言)。 / p>
在Request.ServerVariables("HTTP_X-ORIGINAL-URL")
中使用controllers.asp
,您可以抓取输入的实际网址,返回类似的内容。/real/url
在controllers.asp
中,使用Server.Execute("view1.asp")
我有一个名为routes.asp
的类文件,它包含在每个模型/类文件中,并帮助我收集URL属性oRoute.GetPath_FirstDirectory()
等等。然后,模型/类文件使用此数据创建可由视图使用的属性值。在每个模型/类中使用CLASS_INITIALIZE
从路径/网址填充自己,或者也可以直接在视图中完成。
在相应的视图中,我使用<!--#include file="class.asp"-->
包含我的类/模型文件(如果需要),然后只需打开Set Model = new cModelClass
即可初始化并开始在视图中使用它。我没有在controllers.asp
中包含该类,因为在将controllers.asp
用于视图时,该视图不会继承Server.Execute()
中的任何变量。所以我include
直接在视图中。
错误处理可以在多个级别,但理想情况下在controllers.asp
。特定的错误处理通常在实际的模型/类CLASS_INITIALIZE
,以避免在控制器中多余使用类,因为它已经在视图中初始化。
现在这不是.Net mvc中的内容,但它是我提出的最好的方式,也是我最容易维护的方式。也许其他人有其他实现,但这是我的,完全基于我的经验。到目前为止,它已经做得很好。