按名称查找MVC模板视图

时间:2013-05-02 14:37:26

标签: asp.net-mvc

我正在编写HtmlHelper扩展名,我需要按名称搜索模板的存在。所讨论的模板可以是显示器或编辑器模板,具体取决于上下文。我最初的想法是使用ViewEngines.Engines.FindPartialView方法。但是,此方法似乎不会搜索~/Views/Shared/DisplayTemplates~/Views/Shared/EditorTemplates目录 我想这是有充分理由的。毕竟,如果没有上下文的其他信息,ViewEngine如何知道是否返回显示或编辑模板?

因此,这导致了一个问题:如何搜索特定的 EditorTemplate / DisplayTemplate 我考虑过向{{1}添加自定义视图引擎集合包括这些位置。但是,我担心这可能会有问题。

我主要担心的是, DisplayTemplate / EditorTemplate 视图可能会出于意外情况而提供。有没有其他人认为这是一个问题?
在必要时新建特定的ViewEngines / DisplayTemplateViewEngine实例是否更好,并使EditorTemplateViewEngine集合清除此特定功能?
还有其他我想念的东西吗?

3 个答案:

答案 0 :(得分:4)

我非常喜欢MVC框架是开源的!我能够从TemplateHelpers类(MVC运行时内部)确定在渲染模板时考虑DataBoundControlMode。答案很简单!我所要做的就是在模板名称前加上相应的模板导向器。所以,要找到一个显示模板:

var metadata = ModelMetadata.FromLambdaExpression(expression, HtmlHelper.ViewData);
ViewEngines.Engines.FindPartialView(
    _controllerContext, 
    string.Format("DisplayTemplates/{0}", metadata.TemplateHint))

无需其他视图引擎或路由!如果您对该应用程序感兴趣,我的帮助程序是为给定模型自动生成UI组件。我想启用自定义模板的存在以绕过自动渲染。

答案 1 :(得分:0)

WebFormViewEngine有一些属性可定义(模式)搜索视图的位置。

您可以遵循您使用的视图引擎的惯例,也可以使用自定义视图路径创建自定义视图引擎(对于examlpe扩展Razor)。

后者解释为here

public class CustomViewEngine : RazorViewEngine
{
    public CustomViewEngine()
    {
        var viewLocations =  new[] {  
            "~/Views/{1}/{0}.cshtml",  
            "~/Views/Shared/{0}.cshtml",  
            "~/Views/Shared/DisplayTemplates/{0}.cshtml",  
            "~/Views/Shared/DisplayTemplates/{1}/{0}.cshtml",
            // etc
        };

        this.PartialViewLocationFormats = viewLocations;
        this.ViewLocationFormats = viewLocations;
    }
}

所以我猜你的助手应该查看当前的视图引擎并查找其视图位置路径并按顺序搜索它们。 Html帮助器是否有方法或属性来获取您当前正在运行的视图?

答案 2 :(得分:0)

为什么你只是映射相对路径

string path = Server.MapPath("~/View/");

然后检查文件是否以该特定目录中的.cshtml出口为基础退出

string fileName = "MyView.cshtml";
if (File.Exists(path + fileName))
    //do somethings
else
    //do another things