65.9K
CodeProject 正在变化。 阅读更多。
Home

为 MVC 应用程序创建自己的 MVC 视图引擎

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.47/5 (11投票s)

2011年12月4日

CPOL

2分钟阅读

viewsIcon

101226

downloadIcon

1975

将您自己的 MVC 视图引擎实现到 MVC 应用程序中。

引言

ASP.NET MVC 框架中使用的视图引擎是 Razor 视图引擎和 Web Form 视图引擎。Razor 视图引擎使用 .cshtml.vbhtml。而 Web Form 视图引擎使用 .aspx 来设计用户界面的布局。

ASP.NET MVC 框架的设计旨在支持替代视图引擎,并且已经存在许多开源的 Web Form 视图引擎替代方案,例如 Nhaml(发音为 enamel)、spark、Brail、nVelocity。不同的视图引擎允许您以不同的方式编写视图。

在一个 MVC 应用程序中使用多个视图引擎是可能的。为此,需要在 global.aspx 文件中注册多个引擎。

自定义视图引擎

创建您自己的自定义视图引擎非常简单。当您创建自己的视图引擎时,您只需要考虑如何编写您的视图。

创建自定义视图引擎最简单的方法是从 abstract VirtualPathProviderViewEngine 类派生一个新的视图引擎。这个基类可以处理查找和缓存视图的所有底层机制。

现在来看一个简单的 MyViewEngine 示例,它将返回一个简单的视图。

第一步是创建一个空的 MVC 应用程序。然后添加一个名为 MyViewEngine.cs 的类文件,并从 VirtualPathProviderViewEngine 继承该类,并重写 createview createpartialview 方法。这些方法返回 MYView 类的实例。您的类将如下所示

 public class MyViewEngine : VirtualPathProviderViewEngine
    {
        public MyViewEngine()
        {
            // Define the location of the View file
            this.ViewLocationFormats = new string[] 
        { "~/Views/{1}/{0}.myview", "~/Views/Shared/{0}.myview" };

            this.PartialViewLocationFormats = new string[] 
        { "~/Views/{1}/{0}.myview", "~/Views/Shared/{0}.myview" };
        }

        protected override IView CreatePartialView
    (ControllerContext controllerContext, string partialPath)
        {
            var physicalpath = controllerContext.HttpContext.Server.MapPath(partialPath);
            return new MyView(physicalpath);
        }

        protected override IView CreateView
    (ControllerContext controllerContext, string viewPath, string masterPath)
        {
            var physicalpath = controllerContext.HttpContext.Server.MapPath(viewPath);
            return new MyView(physicalpath);
        }
    }

请注意,在构造函数中,我们设置了基类的两个属性。这些属性指示视图引擎应该在哪里搜索以找到匹配的视图或部分视图。parameter {1} 表示控制器的名称,而 parameter {0} 表示操作的名称。

现在,创建一个名为 MyView 的类,该类实现 IView 接口。这个类实际上渲染视图。MYView 类的代码如下所示

 public class MyView : IView
    {
        private string _viewPhysicalPath;

        public MyView(string ViewPhysicalPath)
        {
            _viewPhysicalPath = ViewPhysicalPath;
        }

        #region IView Members

        public void Render(ViewContext viewContext, System.IO.TextWriter writer)
        {
            //Load File
            string rawcontents = File.ReadAllText(_viewPhysicalPath);

            //Perform Replacements
            string parsedcontents = Parse(rawcontents, viewContext.ViewData);

            writer.Write(parsedcontents);
        }

        #endregion

        public string Parse(string contents, ViewDataDictionary viewdata)
        {
            return Regex.Replace(contents, "\\{(.+)\\}", m => GetMatch(m,viewdata));
        }

        public virtual string GetMatch(Match m, ViewDataDictionary viewdata)
        {
            if (m.Success)
            {
                string key = m.Result("$1");
                if (viewdata.ContainsKey(key))
                {
                    return viewdata[key].ToString();
                }
            }
            return string.Empty;
        }
    }

类的 Render 方法加载视图文件并将视图数据注入到视图中,并将结果写入文本写入器。

在使用之前,需要使用以下代码在 Global.asax 文件中注册自定义视图引擎

protected void Application_Start()
 {
       AreaRegistration.RegisterAllAreas();

       RegisterGlobalFilters(GlobalFilters.Filters);
       RegisterRoutes(RouteTable.Routes);

       //Register your View Engine Here.
       ViewEngines.Engines.Add(new MyViewEngine());
}

现在在控制器文件夹中创建一个名为 myViewController 的控制器文件,并在控制器中定义索引操作。您的控制器类将如下所示

public class myViewController : Controller
 {
      //
     // GET: /myView/
     public ActionResult Index()
     {
         ViewData["Message"] = "Hello World!";
         return View();
     }
}

现在在 View/MyView/ 文件夹中添加一个简单的 HTML 文件,并将其命名为 index.myview。您的视图文件标记如下所示

<html>
<head>
             <title>Index MyView </title>
</head>
<body>{message}
</body>
</html> 

现在运行应用程序并输入 URL /MyView /Index。您将在浏览器中获得 Hello World! 的输出。MyView 类加载 index.myview 文件,并将 {message} 替换为 hello world! 并渲染 HTML 页面。

结论

在开发自定义视图引擎之后,我们可以说 MVC 团队在提供一个非常灵活的框架方面做得非常出色,以便我们可以根据需要调整和自定义它以适应我们的应用程序。

© . All rights reserved.