2014-01-20 34 views
2

因此,我一直在修補我正在處理的MVC應用的視圖位置,具體是因爲我需要能夠在子站點中爲父站點使用視圖/路由。自定義視圖引擎位置視圖模型解析問題

最終我希望能夠從不同位置提供視圖,比如〜/ 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" 
}; 

如果我改變視圖引擎,和後生成任務,指/內容複製到〜/視圖/站點A/..而不是〜/ SiteAViews/..這一切的偉大工程和解析視圖模型。但是,〜/ SiteAViews/..我收到以下內容。

異常類型:HttpParseException異常消息:無法加載 類型 'System.Web.Mvc.ViewPage < 'Shared.MyViewModel'>'。在處System.Web.UI.TemplateParser System.Web.UI.TemplateParser.ParseFile(字符串physicalPath, VirtualPath virtualPath) System.Web.UI.TemplateParser.ParseString(字符串文本,VirtualPath virtualPath,編碼fileEncoding)。解析()在 System.Web.Compilation.BaseTemplateBuildProvider.get_CodeCompilerType() 在 System.Web.Compilation.BuildProvider.GetCompilerTypeFromBuildProvider(BuildProvider buildProvider)在 System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders() 的系統。 Web.Compilation.BuildProvidersCompiler.PerformBuild()at System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath vir tualPath)

回答

2

你缺少在查看文件夾中找到在web.config文件中的信息。在asp.net對於給定的文件夾中的配置將下面這個層次的web.config文件來解決:

machine.config -> root application web.config -> subdirectory web.config 

在ASP MVC的情況下,在意見的web.config文件文件夾配置默認的命名空間在將每個視圖編譯到其類中時包含在內,以及一個防止視圖文件被直接訪問的默認處理程序。見this question

正如你已經在你的項目的根目錄中創建另一個目錄SiteAViews(即查看文件夾外),你缺少基本的MVC配置是~/Views/web.config提供。您可以通過將~/Views/web.config複製到~/SiteAViews/web.config來修復它。 (如果您使用的是Razor,您可能還需要複製_ViewStart.cshtml文件)

如果您不想維護2個類似的配置文件,您需要創建一個具有公共根目錄的視圖文件夾層次結構你可以把網頁。配置文件(並相應地調整您的視圖引擎):

~/ViewLocations/web.config  //common asp mvc views config 
~/ViewLocations/Views/   //SiteB views 
~/ViewLocations/SiteAViews/ //SiteA views 

//In your view engine: 
this.ViewLocationFormats = new string[8] 
{ 
    "~/ViewLocations/Views/{1}/{0}.aspx", 
    "~/ViewLocations/Views/{1}/{0}.ascx", 
    "~/ViewLocations/Views/Shared/{0}.aspx", 
    "~/ViewLocations/Views/Shared/{0}.ascx", 

    "~/ViewLocations/SiteAViews/{1}/{0}.aspx", 
    "~/ViewLocations/SiteAViews/{1}/{0}.ascx", 
    "~/ViewLocations/SiteAViews/Shared/{0}.aspx", 
    "~/ViewLocations/SiteAViews/Shared/{0}.ascx" 
}; 

希望它有幫助!

+0

謝謝丹尼爾。很好的答案,這不用說工作。我將web.config複製到SiteAViews中,並且一切正常。我會盡全力考慮你的答案,以獲得最好的,而不是最快的解決方案。我從來沒有看過Views/Web.config的用途,現在我知道了。謝謝。 –

+0

乾杯蒂姆,很高興能夠幫助:) –