ASP.NET MVC Preview 2 - NVelocityViewEngine

4703 ワード

前にMVCプロセス分析をしたとき、WebFormの代わりにVelocityを使うのが好きだと言いました.これはWebForm自体が悪いというわけではありませんが、一部の人が言っている「性能」の原因ではありません.実際の開発では、私たちが直面しているページは複雑で、困っているように見えるdiv、style、spanなどがたくさんあります.いくつかの枠線レイアウトや色設定を調整したい「プログラマー」は少ないと思います.WebFormは設計とパッケージ化の原因に基づいて、大量の「非標準HTMLコード」を使用し、米工とページプログラマーの矛盾を招いた.
美工:「私がデザインしたページをめちゃくちゃにしたから、このスタイルで......」
プログラマー「くだらないこと、とっくに言ってたよ.こんなフォーマットで書かなきゃ......」
美工:「ページを修正しました.もう送りました......」
プログラマー「暇がないから、自分で変えないの?」
Velocityは何ですか.私が言う必要はありません.非常に簡単なタグまたは論理制御を使用すると、私たちのデータをアメリカのデザインページに「埋め込む」ことができます.私たちは米工に事前にデータを出力する必要がある位置を「」などと東東に表示させることができて、私たちもデータが正しく出力されているかどうかだけに関心を持って、ページの調整は私たちとほとんど関係ありません.もちろん、一定の興味を持っている美工やグループの中の新人に対して、1日か半日以内にVelocityの使い方をマスターすることができて、どうして喜んでいませんか?多くのWebサイトでは、私たちが通常プレゼンテーションに使用しているいくつかのExampleほど簡単ではないページ表示を頻繁に調整していることを知っておく必要があります.
カスタムビューエンジンを使用するには、注入位置を見つける必要があります.前のプロセス分析では、ターゲットであるControllerBuilderをロックしました.public class GlobalApplication : System.Web.HttpApplication
{
  protected void Application_Start(object sender, EventArgs e)
  {
    ControllerBuilder.Current.SetControllerFactory(new NVelocityContrillerFactory());
  }
}

  NVelocityContrillerFactory DefaultControllerFactory, override , Controller.ViewEngine 。

public class NVelocityContrillerFactory : DefaultControllerFactory
{
  protected override IController GetControllerInstance(Type controllerType)
  {
    var controller = base.GetControllerInstance(controllerType);
    (controller as Controller).ViewEngine = new NVelocityViewEngine();
    return controller;
  }
}
に、 たちは のビューエンジンを き めました.public class NVelocityViewEngine : IViewEngine
{
  static NVelocityViewEngine()
  {
    Velocity.SetProperty("resource.loader", "file");
    Velocity.SetProperty("file.resource.loader.path", HttpContext.Current.Server.MapPath("~"));
    Velocity.SetProperty("file.resource.loader.cache", true);
    //Velocity.SetProperty("file.resource.loader.modificationCheckInterval", 10L); //seconds
    Velocity.SetProperty("input.encoding", "utf-8");
    Velocity.Init();
  }
  public void RenderView(ViewContext viewContext)
  {
    var locator = new NVelocityViewLocator() as IViewLocator;
    var templatePath = locator.GetViewLocation(viewContext, viewContext.ViewName);
    var template = Velocity.GetTemplate(templatePath);
    var context = new VelocityContext();
    if (viewContext.ViewData != null)
    {
      var properties = viewContext.ViewData.GetProperties(); //  , 。
      foreach (var item in properties.Keys)
      {
        context.Put(item, properties[item]);
      }
    }
    template.Merge(context, viewContext.HttpContext.Response.Output);
  }
}
も で, でNVelocityを するほか,ViewDataについてもいくつかの を った.もちろん、 のディレクトリからテンプレートファイルを することをサポートするために、NVelocityViewLocatorをもう1つ したほうがいいです.public class NVelocityViewLocator : ViewLocator
{
  public NVelocityViewLocator()
  {
    this.ViewLocationFormats = new[] 
    {
      "/Views/{1}/{0}.vm",
      "/Views/{1}/{0}.htm",
      "/Views/{1}/{0}.html",
      "/Views/Shared/{0}.vm",
      "/Views/Shared/{0}.htm",
      "/Views/Shared/{0}.html",
    };
    this.MasterLocationFormats = new string[0];
  }
}
たちはもっと くの をサポートすることができます.ほほほ~~~~~~~よし、テストしてみましょう.public class HomeController : Controller
{
  public void Index()
  {
    this.RenderView("index", new { Title = "TemplateEngine Test", Name = "Tomcat" });
  }
}

~/View/Home/index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/....dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
 <title>$Title</title>
</head>
<body>
  Hello, $Name!
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/....dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
  <title>TemplateEngine Test</title>
</head>
<body>
  Hello, Tomcat!
</body>
</html>
なことを れ、NVelocityはCastle MonoRailのパッケージで つけることができます.