2013-02-02 23 views
3

我想在我的.cshtml文件中使用自定義名稱空間中的模型。但是,每當我嘗試設置模型時,Razor都會拋出一個The type or namespace name could not be found錯誤。Razor在解決方案文件夾中查看?

我已經得到了解決使用的文件夾,以幫助組織項目設置,如下圖所示: Shows the FolderStructure of MyProject

這裏是在MyViewModel.cs文件中的代碼是什麼樣子:

namespace MyProject.ViewModels 
{ 
    public class MyViewModel 
    { 
    } 
} 

好吧,所以這是基本的佈局。問題是,當我嘗試在我的Razor視圖中使用MyViewModel對象時,Razor說它無法找到名稱空間。如下所示: Razor cannot find the namespace

我相信我正在盡我所能。這看起來好像Razor無法查看解決方案文件夾。我怎樣才能讓MyViewModel對象被Razor識別?有什麼我失蹤?

請注意:我知道我可以簡單地更改我的@using聲明以引用整個路徑。但是,在我的項目中,ViewModels文件夾中有許多解決方案文件夾,我不想通過並指定每個解決方案文件夾。

更新

我已經接受Darin的答案,因爲它成功地回答了這個問題。我還提供了一些關於我的具體情況以及爲什麼會出現這個問題的更多信息。

我對這個問題進行了更深入的研究,弄清楚了究竟發生了什麼。我通常使用SparkViewEngine,它允許像這樣引用我的視圖模型:<viewdata model="ViewModels.MyViewModel"/>當Razor不允許我以相同的方式引用視圖模型時,我認爲Razor出了問題。

每個ViewEngine都會創建用於幫助生成視圖的臨時CS文件。 Spark創建的臨時文件使用「controllers」命名空間。在這種情況下,Spark將在其臨時CS文件中使用MyProject.Controllers名稱空間。這意味着我可以引用ViewModels.MyViewModel對象而不指定完整的名稱空間,因爲它與生成的CS文件位於相同的名稱空間中。

由Razor生成的臨時文件使用ASP命名空間。這意味着我不能在不指定完整名稱空間的情況下引用ViewModels.MyViewModel對象,因爲它與生成的CS文件不在同一個名稱空間中。

回答

4

將您聲明視圖模型的命名空間添加到您的剃鬚刀vi的頂部EW使用@using指令:

@using MvcApplication1.ViewModels 
@model MyViewModel 

同時,爲了避免在每一個Razor視圖加入這個你想使用它,你可以把它添加到您的~/Views/web.config文件的<namespaces>部分(不~/web.config混淆):

<system.web.webPages.razor> 
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    <pages pageBaseType="System.Web.Mvc.WebViewPage"> 
     <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Routing" /> 

     <add namespace="MvcApplication1.ViewModels" /> 
     </namespaces> 
    </pages> 
</system.web.webPages.razor> 

另請注意我是如何指定完整的命名空間的。在你顯示的截圖中,你似乎只使用了ViewModels.MyViewModel,但是你確定這是正確的命名空間嗎?通常當你在Visual Studio中添加一個類文件時,它將使用應用程序名稱+文件夾作爲名稱空間的前綴,如MvcApplication1.ViewModels

+0

感謝您的回覆。正確的命名空間是「MyProject.ViewModels.MyViewModel」。正如你注意到的那樣,我正在使用'ViewModels.MyViewModel',但在上面我聲明瞭一個@using MyProject'。由於我的使用語句,我認爲Razor會知道在'MyProject'裏面查找'ViewModels'。 – jeremysawesome

+0

不,您的使用語句應該是「@using MyProject.ViewModels」,然後您可以直接使用「MyViewModel」。 –

+0

謝謝!我想清楚發生了什麼事。通常我使用Spark視圖引擎,它允許我用'ViewModels.MyViewModel'指定模型。它歸結爲Spark在其臨時文件中使用的實際名稱空間以及Razor在其臨時文件中使用的名稱空間。 Spark使用控制器名稱空間,即知道「ViewModels.MyViewModel」的'MyProject.Controllers'。 Razor使用不知道「ViewModels.MyViewModel」的ASP命名空間「ASP」。 – jeremysawesome

1

@using指令應該在你的命名空間指向:

@using MyProject.ViewModels 

然後聲明你的模型類:

@model MyViewModel 

或者,直接使用全名:

@model MyProject.ViewModels.MyViewModel 
相關問題