【问题标题】:Can I Add to the Display/EditorTemplates Search Paths in ASP.NET MVC 3?我可以添加到 ASP.NET MVC 3 中的 Display/EditorTemplates 搜索路径吗?
【发布时间】:2011-07-31 16:58:36
【问题描述】:

我有一组标准模板用于我的 mvc 项目,我想将其作为外部文件夹保存在我的源代码管理 (SVN) 中

这意味着我不能将任何项目特定文件放在此文件夹中,因为它将被提交到错误的位置.. .. 我的标准模板需要覆盖 MVC 本身使用的模板,因此它们需要位于 MVC 期望覆盖模板的位置(例如 ~/Views/Shared/EditorTemplates)

那么我可以把我的项目特定的放在哪里?

例如,我是否应该将它们放在 ~/Views/Shared/SiteEditorTemplates 中,然后将路径添加到搜索中? 我该怎么做? 或其他建议?

谢谢你,蚂蚁

【问题讨论】:

标签: asp.net-mvc-3 editortemplates mvc-editor-templates


【解决方案1】:

我个人将特定模板外部化为 NuGet 包,每次启动新的 ASP.NET MVC 项目时,我只需导入此 NuGet 包并将模板部署在各自的位置 (~/Views/Shared/EditorTemplates) 以覆盖默认模板.

【讨论】:

  • 我真的很想对它们进行源代码控制,所以我可以对它们进行版本控制和分支等。如果我更进一步了解它们,那将是一个好方法
  • @Anthony Johnston,NuGet 包也可以进行版本控制并置于源代码控制之下。
  • 是的,但真的吗?我可以右键单击我的文件夹并更新或提交到来自 VS 的源代码,使用 Nuget 我必须将文件复制回包文件夹,重新生成包,将其上传到 NuGet,稍等片刻,回到我的另一个项目并更新。不要小看 NuGet,我喜欢它,但它不像适当的源代码控制那样方便开发中的代码
  • @Anthony Johnston,这就是我设置自定义构建步骤的原因,它会自动执行您描述的所有操作,这样我就不必手动执行了。我只需更新源代码并单击构建按钮。其余的由我处理。
  • 我可以添加一个构建步骤,将文件从另一个外部目录移动到 EditorTemplates 目录.. 但是在调试时所做的更改将需要构建.. 并且两个地方的代码也会出现问题
【解决方案2】:

好的,明白了

mvc 中的编辑器代码在 PartialViewLocationFormats 中为引擎添加 DisplayTemplates 或 EditorTemplates 寻找编辑器。

所以,我在视图下创建了一条新路径 ~/视图/标准/

然后把我的标准东西放在那里 ~/Views/Standard/EditorTemplates/string.cshtml

现在,在 global.asax Application_Start 中注册引擎中的新路径

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

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

    ViewEngines.Engines.Clear();
    var viewEngine = new RazorViewEngine {
        PartialViewLocationFormats = new[]
        {
            "~/Views/{1}/{0}.cshtml",
            "~/Views/Shared/{0}.cshtml",
            "~/Views/Standard/{0}.cshtml"
        }
    };

    ViewEngines.Engines.Add(viewEngine);
}

请注意,这将摆脱 webforms 视图引擎和 vb 路径,但无论如何我都不需要它们

这使我可以在 SVN 中为 ~/Views/Standard 提供一个外部文件,并在必要时覆盖项目内容 - 啊!

【讨论】:

  • 正如@Simon-Giles 所说,只需添加一个位置,不要替换整个引擎。无论如何都赞成。
【解决方案3】:

您可以更改现有 RazorViewEngine 的 PartialViewLocationFormats 属性,而不是替换 RazorView 引擎(正如 Anthony Johnston 所建议的那样)。此代码在 Application_Start 中:

System.Web.Mvc.RazorViewEngine rve = (RazorViewEngine)ViewEngines.Engines
  .Where(e=>e.GetType()==typeof(RazorViewEngine))
  .FirstOrDefault();

string[] additionalPartialViewLocations = new[] { 
  "~/Views/[YourCustomPathHere]"
};

if(rve!=null)
{
  rve.PartialViewLocationFormats = rve.PartialViewLocationFormats
    .Union( additionalPartialViewLocations )
    .ToArray();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-05
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多