= 99.9 }; return View (); } } 控制器组件是通过 HomeController 类实现的,它会继承 ASP.NET MVC 控制器。 类中只包含一个动作,展现应用程序的索引页面。 当用户访问/Home/Index(或者根 URL)的时候就会触发这个动作。 它会创建模型(Product 类的实例)并把它传递给视图组件。在标准的 ASP.NET MVC 应用程序中,视图组件通常会使用 ASPX 页面或者使用带有使用 C# 或 Visual Basic 编写的代码的 Razor 视图来实现。 Phalanger 让我们可以使用 PHP 来实现视图。 代码 3 展示了这个例子。代码 3 示例 Web 应用程序(PHP)的视图<html><head> <title>Sample view written in PHP</title> </head> <body> <h1>Product Listing using Phalanger</h1> Product: <? echo $MODEL->ProductName; ?><br /> Price: <? echo $MODEL->Price; ?> </body></html> 视图会使用下面描述的 ASP.NET MVC 扩展来渲染。 扩展会执行代码 3 中所示的 PHP 脚本,并定义名为$MODEL 的全局变量,其中会包含控制器返回的数据。 在上述示例中,$MODEL 是对标准 .NET 类的引用。 Phalanger 会对 .NET 类和 PHP 对象同等对待,所以使用 echo 结构,我们很容易就可以显示产品的属性。示例显示了应用程序的基本结构,但是它极为简单,所以不会真正显示出在表现层使用 PHP 所能给我们带来的好处: PHP 与生俱来的动态特性使得渲染任何结构的数据都很简单。 视图并不仅限与简单脚本,并且可以使用任何现存的 PHP 库,包括流行的模板引擎(templating engines)。 视图可以使用 PHP 的 include 功能实现多文件的结构,这样你可以完全控制页面如何生成。 创建视图的开发者不需要知道任何关于 .NET 的知识。 这意味着从 PHP 转型为 C# 的公司,仍然支持现存的开发者技能。为了让你更好地了解这个方案的工作方式,以下部分会说明关于 PHP 和 C# 整合的技术细节。 如果你对细节不感兴趣,那么就可以直接跳到总结部分。透过现象看本质这个部分所描述的方案基于 PicoMVC 项目【4】,它让我们可以组合 PHP 和 F#。 为了让示例更简单,我把代码从F#转换为C#。 在 PicoMVC 中 PHP 整合的核心是一个简单的函数,它会取得 PHP 脚本的文件名,并使用 Phalanger 运行时来运行。 函数如代码 4 所示。代码 4 从 ASP.NET web 应用程序调用 PHP 脚本void PhalanagerView (string fileName, object model, HttpContext current) { // Initialize PHP request context and output stream using(var rc = RequestContext.Initialize (ApplicationContext.Default, current)) using(var byteOut = HttpContext.Current.Response.OutputStream) using(var uftOut = new StreamWriter (byteOut)) { // Current context for evaluating PHP scripts var phpContext = ScriptContext.CurrentContext; // Redirect PHP output to the HTTP output stream phpContext.Output = uftOut; p