【问题标题】:How to Download Razor View Engine如何下载 Razor View 引擎
【发布时间】:2011-06-06 09:26:08
【问题描述】:

我想下载并安装 ASP.Net MVC 2 的 razor 视图引擎。我可以从哪里下载和安装?

【问题讨论】:

    标签: asp.net-mvc razor viewengine


    【解决方案1】:

    获得 MVC Razor 引擎并学习如何使用它的最佳途径是向 Scot Gu!整个 Razor 项目的大师。他的博文http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx 非常容易上手,教你如何从 VS 中的 Package Manager Consel 管理脚手架过程。

    【讨论】:

      【解决方案2】:

      利用 Codeplex 的 Matthew Abbott 和 My Razor 视图引擎。您可以执行以下操作。它不支持模型或布局页面,但如果您选择走这条路线,它会让您朝着正确的方向前进。不过坦率地说,我会在时机成熟时更新到 MVC 3。此代码基于我在http://buildstarted.com/2010/11/22/making-your-own-viewengine-with-markdown/ 的博客文章

      您必须将以下行添加到 global.asax:

      ViewEngines.Engines.Clear();
      ViewEngines.Engines.Add(new RazorViewEngine.RazorViewEngine());
      

      除非您想要两个引擎,在这种情况下只需删除 Clear()

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Web;
      using System.Web.Mvc;
      using System.Web.Hosting;
      using System.IO;
      using System.Text.RegularExpressions;
      using System.Xml.Linq;
      
      namespace RazorViewEngine {
          /// <summary>
          /// ViewEngine for the RazorView. Provides basic file handling to load views. 
          /// </summary>
          public class RazorViewEngine : IViewEngine {
      
              string[] SearchLocations { get; set; }
              Tuple<string, string, RazorView> Cache { get; set; }
              VirtualPathProvider VirtualPathProvider { get; set; }
      
              public RazorViewEngine() {
                  //{1} == Controller name
                  //{0} == View name
                  SearchLocations = new string[] {
                      "~/Views/{1}/{0}.cshtml",
                      "~/Views/Shared/{0}.cshtml",
                  };
      
                  VirtualPathProvider = HostingEnvironment.VirtualPathProvider;
              }
      
              #region IViewEngine Members
      
              public ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache) {
                  return CreateView(controllerContext, partialViewName, null, null, useCache);
              }
      
              public ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) {
                  return CreateView(controllerContext, viewName, masterName, GetLayoutPath(controllerContext), useCache);
              }
      
              /// <summary>
              /// Meat of the FindView methods.
              /// </summary>
              /// <param name="controllerContext">The current controller context for this request.</param>
              /// <param name="viewName">The requested view name. </param>
              /// <param name="masterName">The master page view name (currently unused)</param>
              /// <param name="layoutPath">The layout path location (Replaces the masterpage in other view engines)</param>
              /// <param name="useCache">Cache the viewpage?</param>
              /// <remarks>The layout path is currently hardcoded to "Layout" and will look in the SearchLocations for that path</remarks>
              /// <returns>Returns a ViewEngineResult with the requested view</returns>
              public ViewEngineResult CreateView(ControllerContext controllerContext, string viewName, string masterName, string layoutPath, bool useCache) {
                  //grab the current controller from the route data
                  string controllerName = controllerContext.RouteData.GetRequiredString("controller");
      
                  //for proper error handling we need to return a list of locations we attempted to search for the view
                  string[] SearchedLocations;
      
                  //get the actual path of the view - returns null if none is found
                  string viewPath = GetViewPath(viewName, controllerName, out SearchedLocations);
      
                  if (viewPath != null) {
                      RazorView view = new RazorView(this, controllerContext, viewPath, layoutPath);
                      return new ViewEngineResult(view, this);
                  }
      
                  //we couldn't find the view - return an array of all locations we've looked in
                  return new ViewEngineResult(SearchedLocations);
              }
      
              /// <summary>
              /// Look for the view in the current file system
              /// </summary>
              /// <param name="viewName">The name of the View you're looking for</param>
              /// <param name="controllerName">Current controller name</param>
              /// <param name="SearchedLocations">out a list of locations searched</param>
              /// <returns>A string value of the relative path</returns>
              public string GetViewPath(string viewName, string controllerName, out string[] SearchedLocations) {
                  return FindPath(viewName, controllerName, out SearchedLocations);
              }
      
              /// <summary>
              /// Look for the view in the current file system
              /// </summary>
              /// <param name="viewName">The name of the View you're looking for</param>
              /// <param name="controllerName">Current controller name</param>
              /// <param name="SearchedLocations">out a list of locations searched</param>
              /// <returns>A string value of the relative path</returns>
              public string FindPath(string viewName, string controllerName, out string[] SearchedLocations) {
                  SearchedLocations = new string[SearchLocations.Length];
      
                  for (int i = 0; i < SearchLocations.Length; i++) {
                      string virtualPath = string.Format(SearchLocations[i], viewName, controllerName);
      
                      SearchedLocations[i] = virtualPath;
      
                      //check the active VirtualPathProvider if the file exists
                      if (VirtualPathProvider.FileExists(virtualPath)) {
                          //add it to cache - not currently implemented
                          return VirtualPathProvider.GetFile(virtualPath).VirtualPath;
                      }
                  }
      
                  return null;
              }
      
              /// <summary>
              /// Get the layout virtual path
              /// </summary>
              /// <param name="controllerContext">The current Controller context for this request</param>
              /// <returns>A string virtual path</returns>
              public string GetLayoutPath(ControllerContext controllerContext) {
                  //This should probably be added to a list of locations - I'm not sure exactly
                  //what I need to do with this yet.
                  string[] locations;
      
                  return FindPath("Layout", controllerContext.RouteData.GetRequiredString("controller"), out locations);
              }
      
              /// <summary>
              /// Current irrelevant
              /// </summary>
              /// <param name="controllerContext">The active controller context</param>
              /// <param name="view">View to release</param>
              public void ReleaseView(ControllerContext controllerContext, IView view) {
                  IDisposable disposable = view as IDisposable;
                  if (disposable != null) {
                      disposable.Dispose();
                  }
              }
      
              #endregion
          }
      
          /// <summary>
          /// Implements IView and renders a Razor
          /// </summary>
          public class RazorView : IView {
      
              ControllerContext ControllerContext;
              string ViewPath;
              string LayoutPath;
              RazorViewEngine Engine;
      
              public RazorView(RazorViewEngine engine, ControllerContext controllerContext, string viewPath, string layoutPath) {
                  //load the file
                  this.ControllerContext = controllerContext;
                  this.ViewPath = viewPath;
                  this.LayoutPath = layoutPath;
                  this.Engine = engine;
              }
      
              #region IView Members
      
              /// <summary>
              /// Converts Razor to html and writes it to the passed in writer
              /// </summary>
              /// <param name="viewContext"></param>
              /// <param name="writer"></param>
              public void Render(ViewContext viewContext, System.IO.TextWriter writer) {
                  //View contents
                  string contents = new StreamReader(VirtualPathProvider.OpenFile(ViewPath)).ReadToEnd();
                  string layoutContents = LayoutPath == null
                      ? null
                      : new StreamReader(VirtualPathProvider.OpenFile(LayoutPath)).ReadToEnd();
      
                  contents = Parse(contents);
      
                  string output;
                  output = contents;
      
                  writer.Write(output);
              }
      
              /// <summary>
              /// Converts Razor to html
              /// </summary>
              /// <param name="Razor">Razor text</param>
              /// <returns>Html formatted Razor text</returns>
              string Parse(string Razor) {
      
                  //Where do I get the model From
      
                  return RazorEngine.Razor.Parse(Razor);
              }
      
              #endregion
          }
      
      }
      

      【讨论】:

      • 我已经设置了一个完全不同的视图引擎,部分基于您的代码 (tqcblog.com/2011/01/23/…)。如果您使用预编译来减少运行时依赖性,那么支持模型、布局等会容易得多。我还没有尝试过 mvc2/.net3.5 的组合,但它应该可以在没有太多参考更改的情况下工作。
      【解决方案3】:

      可能有点过时,但您或许应该看看这篇文章。

      http://stefan.rusek.org/Posts/Using-Razor-with-ASP-NET-MVC-in-Four-Easy-Steps/26/

      Razor 能够独立运行,因此完全可以自己提供接线。无论您是否需要使用 .NET4,我都不能 100% 确定。另一方面,MVC3 处于 RC 状态,并且有一个 Go-Live 许可证,从技术上讲,您现在可以开始使用它,并且当 RTM 命中(很快)时只需升级。

      【讨论】:

      • System.Web.Razor 确实以框架的 v 4.0 为目标。鉴于 MVC3 的 RTM 迫在眉睫,我同意在现阶段尝试将 Razor 插入 MVC2 应用程序似乎毫无意义。
      【解决方案4】:

      【讨论】:

      • 如前所述,您仍然可以在版本
      猜你喜欢
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多