所以我一直在修改我正在处理的MVC应用程序的View位置,特别是因为我需要能够在子站点中使用父站点的视图/路由。
最终我希望能够提供来自不同位置的视图,比如〜/ SiteAViews / ..其中〜是站点B的根目录,存放在站点〜/ SiteAViews /中的视图是在帖子中复制的视图从SiteA构建事件。
使用自定义视图引擎听起来很简单。但是,我在自定义视图引擎(下面的示例更改)中添加了视图和母版页的位置。访问URI时出现问题,因此在SiteA dll中定义的路由(在siteB中引用)。
this.ViewLocationFormats = new string[8]
{
"~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.ascx",
"~/Views/Shared/{0}.aspx",
"~/Views/Shared/{0}.ascx",
"~/SiteAViews/{1}/{0}.aspx",
"~/SiteAViews/{1}/{0}.ascx",
"~/SiteAViews/Shared/{0}.aspx",
"~/SiteAViews/Shared/{0}.ascx"
};
如果我更改视图引擎,并发布构建任务,引用/复制内容到〜/ views / SiteA / ..而不是〜/ SiteAViews / ..这一切都很好并解析ViewModel。但是,使用〜/ SiteAViews / ..我收到以下内容。
异常类型:HttpParseException异常消息:无法加载 键入'System.Web.Mvc.ViewPage<'Shared.MyViewModel'>'。在 System.Web.UI.TemplateParser.ParseString(String text,VirtualPath virtualPath,编码fileEncoding) System.Web.UI.TemplateParser.ParseFile(String physicalPath, VirtualPath virtualPath)在System.Web.UI.TemplateParser.Parse()at System.Web.Compilation.BaseTemplateBuildProvider.get_CodeCompilerType() 在 System.Web.Compilation.BuildProvider.GetCompilerTypeFromBuildProvider(BuildProvider buildProvider)at System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders() 在System.Web.Compilation.BuildProvidersCompiler.PerformBuild()at System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath)
答案 0 :(得分:2)
您缺少视图文件夹中的web.config
文件中的信息。在asp.net中,将根据web.config
文件的层次结构解析给定文件夹的配置:
machine.config -> root application web.config -> subdirectory web.config
对于asp mvc, Views 文件夹中的web.config文件将配置在将每个视图编译到其类时包含的默认命名空间以及用于阻止视图文件的默认处理程序直接访问。请参阅this question。
由于您在项目的根目录中创建了另一个目录 SiteAViews (即在 Views 文件夹之外),因此您缺少基本的mvc配置{{1}提供。您可以通过将~/Views/web.config
复制到~/Views/web.config
来解决此问题。 (如果您使用的是Razor,您可能还想复制_ViewStart.cshtml文件)
如果您不想维护2个类似的配置文件,则需要创建一个具有公共根目录的视图文件夹层次结构,您可以在其中放置web.config文件(并相应地调整视图引擎):
~/SiteAViews/web.config
希望它有所帮助!