5

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

所以,这就引出了一个问题:如何搜索特定的EditorTemplate / DisplayTemplate我已经考虑将自定义视图引擎添加到ViewEngines集合中以包含这些位置。然而,我担心这可能是有问题的。

我主要担心的是DisplayTemplate / EditorTemplate视图可能会用于意外情况。有没有其他人认为这是一个问题?在必要时新建一个特定的/实例并保持集合中没有这个特定的功能
是一个更好的主意吗? 还有什么我想念的吗?DisplayTemplateViewEngineEditorTemplateViewEngineViewEngines

4

3 回答 3

4

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

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

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

于 2013-05-02T15:05:51.537 回答
0

AWebFormViewEngine有一些属性定义(模式)位置以搜索视图。

您要么遵循您使用的视图引擎的约定,要么使用自定义视图路径创建自定义视图引擎(例如扩展 Razor)。

后者在这里解释:

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 助手没有获取当前正在运行的视图的方法或属性吗?

于 2013-05-02T14:43:17.063 回答
0

为什么你只映射相对路径

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

.cshtml然后根据该特定目录中的退出检查文件是否退出

string fileName = "MyView.cshtml";
if (File.Exists(path + fileName))
    //do somethings
else
    //do another things
于 2013-05-02T14:46:52.637 回答