Asp.net mvc 按名称查找MVC模板视图

Asp.net mvc 按名称查找MVC模板视图,asp.net-mvc,Asp.net Mvc,我正在写一个HtmlHelper扩展,我需要按名称搜索模板是否存在。所讨论的模板可能是显示或编辑器模板,具体取决于上下文。我最初的想法是使用ViewEngines.Engines.FindPartialView方法。但是,该方法似乎没有搜索~/Views/Shared/DisplayTemplates和~/Views/Shared/EditorTemplates目录。 我想这是有充分理由的。毕竟,ViewEngine如何知道在没有上下文附加信息的情况下是否返回显示或编辑器模板 因此,这就引出了一

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

因此,这就引出了一个问题:如何搜索特定的EditorTemplate/DisplayTemplate我考虑过在
ViewEngines
集合中添加一个自定义视图引擎来包含这些位置。然而,我担心这可能会有问题

我主要担心的是,DisplayTemplate/EditorTemplate视图可能会出现一些意外情况。还有人认为这是个问题吗?
如果需要,只需新建一个特定的
DisplayTemplateViewEngine
/
EditorTemplateViewEngine
实例,并将
ViewEngine
集合中的此特定功能清除,这是一个更好的主意吗?

还有什么我遗漏的吗?

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

您可以遵循所使用的视图引擎的约定,也可以使用自定义视图路径创建自定义视图引擎(例如,它扩展了Razor)

后者解释如下:


因此,我想在助手中,您应该查找当前视图引擎,查找其视图位置路径,并按顺序搜索它们。Html助手没有获取当前正在运行的视图的方法或属性吗?

为什么只映射相对路径

string path = Server.MapPath("~/View/");
然后根据
.cshtml
出口所在的特定目录检查文件是否退出

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

我绝对喜欢MVC框架是开源的!我能够从TemplateHelpers类(MVC运行时内部)确定在呈现模板时考虑DataBoundControlMode。答案很简单!我所要做的就是在模板名称前面加上适当的模板控制器。因此,要查找显示模板,请执行以下操作:

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

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

感谢您的回复。我并没有打破惯例;我的结构符合预期的MVC架构定义。问题是ViewEnginesCollection的FindPartialView方法不会搜索这些位置,因为它不知道您是否想要显示或编辑版本。不过,我确实找到了解决办法。参考我的答案。再次感谢。1)示例中的代码是默认的Razor行为吗?2)
{0}
{1}
指的是什么?@Shimmy。替换值是
{0}
=视图名称、
{1}
=控制器名称和
{2}
=区域名称(请参阅)。因此,如何使用位于另一个控制器视图的EditorTemplates文件夹下的视图?@Shimmy提出了一个新问题。使用ViewEngine的一个好处是可以对其进行模拟,使其可测试。这个解决方案很难进行单元测试。不过,很高兴你的意见!这就是答案。然而,我无法在几天内将其标记为这样。如果您被这篇文章吸引是因为它明显处于“未答复”状态,那么很抱歉。什么是metadata.TemplateHint或它来自何处?@xr280xr:已更新以包含元数据定义。希望为您服务!
var metadata = ModelMetadata.FromLambdaExpression(expression, HtmlHelper.ViewData);
ViewEngines.Engines.FindPartialView(
    _controllerContext, 
    string.Format("DisplayTemplates/{0}", metadata.TemplateHint))