Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC3自定义视图引擎_C#_Asp.net Mvc 3_Razor_Webforms - Fatal编程技术网

C# MVC3自定义视图引擎

C# MVC3自定义视图引擎,c#,asp.net-mvc-3,razor,webforms,C#,Asp.net Mvc 3,Razor,Webforms,我有一个从WebFormViewEngine派生的自定义视图引擎。这里有很多东西,主要是缓存。我希望能够同时使用WebFormViewEngine和RazorViewEngine,这可能吗?理想情况下,我想这样做 添加(新的MyViewEngine()) 添加(新的MyViewEngine()) 如果存在.ascx/.aspx/.master文件,则使用WebForms,否则如果存在.cshtml文件,则使用Razor 编辑:我应该把我的问题写得更好。因为我的自定义视图引擎是从WebFormVi

我有一个从WebFormViewEngine派生的自定义视图引擎。这里有很多东西,主要是缓存。我希望能够同时使用WebFormViewEngine和RazorViewEngine,这可能吗?理想情况下,我想这样做

添加(新的MyViewEngine()) 添加(新的MyViewEngine())

如果存在.ascx/.aspx/.master文件,则使用WebForms,否则如果存在.cshtml文件,则使用Razor

编辑:我应该把我的问题写得更好。因为我的自定义视图引擎是从WebFormViewEngine派生的,它显然使用WebForms,所以我不能从两个类派生。我可以从RazorViewEngine派生,但随后我将释放WebForms。我可以完全复制我的代码,从RazorViewEngine派生并编辑视图文件扩展名,等等。但正如我所说,我的视图引擎中有很多自定义代码,将复制数百行


WebFormViewEngine和RazorViewEngine派生自BuildManagerViewEngine,后者反过来实现IViewEngine。问题是我必须实现CreatePartialView()和CreateView()方法,但我如何知道使用泛型返回什么(WebForms/Razor?)

这是可能的,但不推荐使用方法,因为这会给项目带来一些混乱。你可以读到关于它的好文章:

这不重要

默认情况下,MVC3包括
WebFormsViewEngine
RazorViewEngine
,它们都是自动注册的。我相信它们的顺序是
WebFormsViewEngine
,然后是
RazorViewEngine
,这意味着将首先检查web表单视图。如果它找到一个视图,它将使用它。如果不能,它将使用下一个视图引擎,即Razor视图引擎


您是否尝试过删除自定义视图引擎并只保留默认配置

最后,我创建了一个抽象类:
公共抽象类MyViewEngine:BuildManagerViewEngine,IVieEngine{}
,然后实现/覆盖
FindView
FindPartialView
方法(其中包含缓存代码)。我有一个抽象方法
public abstract void setSearchPath()ctor
中调用的代码>

然后,我为WebForms创建了另一个派生自
MyViewEngine
的类:

public class MyViewEngineWebForms : MyViewEngine
{
    public override void SetSearchPaths()
    {
        base.MasterLocationFormats = new string[] { "~/Skins/{2}/Views/{1}/{0}.master", "~/Skins/{2}/Views/Shared/{0}.master" };
        base.ViewLocationFormats = new string[] { "~/Skins/{2}/Views/{1}/{0}.aspx", "~/Skins/{2}/Views/Shared/{0}.aspx", "~/Skins/Shared/Views/{0}.aspx" };
        base.PartialViewLocationFormats = new string[] { "~/Skins/{2}/Views/{1}/{0}.ascx", "~/Skins/{2}/Views/Shared/{0}.ascx", "~/Skins/Shared/PartialViews/{0}.ascx" };
        base.FileExtensions = new string[] { "aspx", "ascx", "master" };
    }

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
    {
        return new WebFormView(controllerContext, partialPath, null, base.ViewPageActivator);
    }

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
    {
        return new WebFormView(controllerContext, viewPath, masterPath, base.ViewPageActivator);
    }
}
对Razor做了完全相同的操作,但将文件扩展名更改为.cshtml/.vbhtml,并将
WebFormView
更改为
RazorView
。将它们添加到
ViewEngine
集合:

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new SeeTicketsWebFormsViewEngine());
ViewEngines.Engines.Add(new SeeTicketsRazorViewEngine());

现在它们又完美地工作了,与我所有的自定义缓存逻辑并排工作。

我编辑了我的问题,我认为我不够清楚。是的,它确实工作了。我需要自定义视图引擎,因为它有很多视图缓存。标准视图引擎中现有的缓存不适合您吗?我想你可以走两条路中的一条。要么构建一个复合视图引擎,按该顺序检查
WebFormsViewEngine
,然后检查
RazorViewEngine
,要么构建一个复合视图引擎,执行两个视图引擎的操作,但根据所选视图的文件扩展名返回特定的
IView
(覆盖
CreateView
CreatePartialView
或您的
VirtualPathProviderViewEngine
)。后者更复杂,因为您需要根据目标类型从逻辑上分离视图定位逻辑。