2011-04-18 74 views
16

我想使用ASP.NET MVC 3和剃刀視圖的可移植視圖,因爲這似乎是創建一個簡單的插件架構的最佳方式。所以我有我的類庫設置,我有我的視圖位於/Views/Admin/Index.cshtml,它被設置爲嵌入式資源。然後,我將該項目作爲主Web應用程序項目的依賴項。當我嘗試訪問管理控制器時,索引操作我收到一條消息,該消息找不到該視圖文件(因此控制器已正確包含在內)。我假設它正在嘗試查看主Web應用程序項目而不是便攜式區域二進制文件。有沒有辦法讓剃鬚刀視圖與便攜式區域一起工作?ASP.NET MVC 3,Razor視圖和可移植區域

回答

0

您是否確定在便攜式區域中將視圖標記爲嵌入式資源?

另外我發現可移植區域的一個很好的特性是你可以覆蓋嵌入式視圖,所以如果你在你的主機應用中放置一個具有不同代碼邏輯的嵌入式相同名稱和位置的視圖,它將優先於嵌入式一個尼斯!

希望這有助於

+0

我想這取決於註冊視圖引擎的順序,如果嵌入視圖引擎是第一個便攜式區域視圖將覆蓋根項目中的常規視圖。作爲一個便箋,我會說你可以通過清除所有的視圖引擎來獲得小的性能增益,並確保你只註冊了你在項目中使用的引擎。見http://insightpassion.com/norbertraus/index.php/2011/04/29/razor-views-performance/ – JohannesH 2011-09-27 21:01:05

12

一直奮鬥在這個具體問題了一段時間,但我想我終於想通了。

文件夾結構以及如何在您的項目中調用名稱空間對於使其正常工作非常重要!

我有一個便攜式區某這裏嵌入式剃刀意見工作的例子:

https://github.com/fretje/MembershipStarterKit

看看該項目的結構。

該區域的名稱是UserAdministration,項目根目錄中有一個UserAdministrationRegistration類,該類位於UserAdministration名稱空間中。 然後有Controllers,ModelsViews文件夾(就像一個正常的MVC項目),並在Views文件夾下,還有一個UserAdministration文件夾,其中包含該區域的視圖。

還有一些對嵌入視圖非常重要的工作:您必須在文件的Application_Start方法中註冊一個新的視圖引擎,您是否這樣做?

PortableAreaRegistration.RegisterEmbeddedViewEngine(); 

而且......在你的註冊類,請確保您覆蓋RegisterArea方法,該方法需要兩個參數(AreaRegistrationContext contextIApplicationBus bus),並調用基實現在那裏:

public override void RegisterArea(AreaRegistrationContext context, 
    IApplicationBus bus) 
{ 
    base.RegisterArea(context, bus); // <== very important! 

    context.MapRoute(
     "UserAdministration", 
     AreaName + "/{controller}/{action}/{id}", 
     new { controller = "UserAdministration", action = "Index", 
       id = UrlParameter.Optional } 
    ); 
} 

如果您不要致電基地執行,您必須至少添加一個

RegisterAreaEmbeddedResources(); 

爲了確保您的嵌入視圖和資源已註冊。

+0

感謝這個答案,正是我所期待的。我仍然看到沒有被發現的錯誤。它被設置爲嵌入式,但仍然沒有。 – Pieter 2011-08-08 20:53:44

+0

我不得不在我的網站中添加一個nuget包引用到EmbeddedResourceVirtualPathProvider以使其工作。 – Pieter 2011-10-03 20:29:01

+0

這看起來和我的相同。它可以在我的開發機器上正常工作,但實際上並沒有在部署後查找寫入視圖文件。我記錄了它所查找的視圖,並完全跳過了.cshtml文件,儘管它找到了_layout和_viewstart的視圖。 – 2011-12-14 23:44:22

1

我按照在Fretje的回答說明瞭這個工作,然後還會在您的網站上添加NuGet包參考EmbeddedResourceVirtualPathProvider

+0

只是參考?你做了什麼來連接它? – 2011-12-14 23:42:28

+1

在Visual Studio中,右鍵單擊解決方案資源管理器中的引用,然後選擇「添加庫包引用」。在彈出窗口中選擇「在線」並搜索「EmbeddedResourceVirtualPathProvider」,然後單擊安裝。請注意,您需要將更新到Service Pack 1的VS2010作爲Nuget包安裝程序的一部分。 – Pieter 2011-12-16 16:08:52