2010-08-23 37 views
4

這是一個奇怪的問題。我改變了一些東西(不知道是什麼),現在我的應用程序的視圖不會在運行時編譯。ASP.NET MVC強類型視圖編譯錯誤

視圖本身是強類型:

<%@ Page Language="C#" 
     MasterPageFile="~/Views/Shared/Site.Master" 
     Inherits="System.Web.Mvc.ViewPage<MyNamespace.OperatorModel>" %> 

當我訪問該網頁時,編譯失敗,他說:

CS1061:「對象」不包含「登錄的定義'並且沒有擴展方法'Log'接受'object'類型的第一個參數可以找到(你是否缺少使用指令或程序集引用?)

Prett y標準錯誤。相應的源代碼行是:

<%= Html.HiddenFor(model => model.Log) %> 

當我看着編譯器生成的代碼,我看到基類的觀點是不是強類型:

[System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()] 
public class views_operator_create_aspx 
    : global::System.Web.Mvc.ViewPage, // NOT STRONGLY TYPED 
     System.Web.SessionState.IRequiresSessionState, 
     System.Web.IHttpHandler { 

所以我的問題是,什麼導致視圖編譯器忽略視圖定義上的Inherits屬性?

我應該指出,在同一個控制器上的其他視圖正在工作,他們有完全相同的頁面聲明,我已經在上面顯示。

編輯有沒有人知道生成的源代碼文件在哪裏生活,假設它被保存在某個地方?

編輯我發現了罪魁禍首(在我的答案中),但我不知道爲什麼會發生這種情況。如果有人能解釋我會很感激!

+0

如果您刪除視圖並添加一個具有相同代碼的新視圖,該怎麼辦? – aolde 2010-08-23 17:58:20

+0

@Manticore - 很好的想法。當我在它的位置創建一個新的空視圖時,它工作正常。當我將舊頁面的內容複製回來時,它會再次失敗。我會一次性複製一些內容,看看是什麼導致它崩潰。看起來我最終可能會在這裏回答我自己的問題:) – 2010-08-23 18:06:09

+0

好主意!如果您發現有趣的事,請告訴我們。 – aolde 2010-08-23 18:15:02

回答

0

好了,所以我縮減我的觀點到這一點:

<%@ Page Language="C#" 
     MasterPageFile="~/Views/Shared/Site.Master" 
     Inherits="System.Web.Mvc.ViewPage<MyNamespace.OperatorModel>" %> 
<%@ Import Namespace="MyNamespace.Data" %> 

<asp:Content ContentPlaceHolderID="MainContent" runat="server"> 
    <%= GetType() %><br /> 
    <%= GetType().BaseType %><br /> 
    <%= GetType().BaseType.BaseType %> 
</asp:Content> 

的產量,即使所有內容領域的空白:

ASP.views_operator_create_aspx
System.Web.Mvc.ViewPage
System.Web.UI.Page

但如果我刪除了<%@ Import線,我得到這個:

ASP.views_operator_create_aspx
System.Web.Mvc.ViewPage`1 [MyNamespace.OperatorModel]
System.Web.Mvc。查看頁面

我不知道爲什麼導入應該導致頁面不再是強類型。有人可以解釋嗎?關於如何調試或跟蹤編譯的任何提示都會很好。現在我可以繼續編寫代碼真是太好了,但這並不是一個令人滿意的結果。

+1

嘗試刪除該導入並將您的名稱空間添加到您的web.config – hunter 2010-08-24 14:22:30

+0

@hunter - 最後,將命名空間添加到'Web.config'解決了這個問題。我仍然想知道是什麼導致了我所看到的問題...... – 2010-08-24 22:29:50

+0

問題是您將該視圖綁定到無法創建自動生成的代碼的類。一旦將該名稱空間添加到Web.config中,您就可以輕鬆完成任務。它本質上是爲OperatorModel的名稱空間添加「using」語句。 – hunter 2010-08-25 00:28:55

2

您是否在Web.Config中正確引用了OperatorModel?這將允許您明確引用OperatorModel

<namespaces> 
    <add namespace="My.Namespace"/> 

或者你可以在你的Inherits值更改爲:

Inherits="System.Web.Mvc.ViewPage<My.Namespace.OperatorModel>" 

此外,通過模型對象的視圖時,一定要檢查空或返回一個空OperatorModel

return View(operatorModel 
    ?? new OperatorModel() { Text = "I can has not found!" }); 
+0

謝謝 - 對不起,我應該在我的問題中包括命名空間(我已經修改了手名)。將編輯。這個模型絕對不是空的,因爲我正在調用'View(...)'。 – 2010-08-23 18:44:33

+0

最後我發現問題的原因,如果不是解決方案。還有什麼想法? http://stackoverflow.com/questions/3550244/asp-net-mvc-strongly-typed-view-compilation-error/3550857#3550857 – 2010-08-23 19:11:11

1

我發現當我有這樣的完全奇怪的錯誤時,有時如果我刪除所有文件的影子副本,它會清除它。您可以在以下位置找到它:

%SYSTEMROOT%\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files 

替換您在上面該行中使用的任何版本的Framework。刪除所有與您的項目相對應的文件(或者刪除目錄中的所有內容)。

您可能不得不關閉您的w3p服務,以確保它放棄所有文件,並且可以將其刪除。

此外,我相信你會發現你在那裏找到你生成的源代碼。

+0

有用的信息,我會在將來使用它,毫無疑問。最後,我發現問題的原因,如果不是解決方案。還有什麼想法? http://stackoverflow.com/questions/3550244/asp-net-mvc-strongly-typed-view-compilation-error/3550857#3550857 – 2010-08-23 19:12:04

1

你沒有碰巧刪除那個存在於你的/ Views文件夾根目錄下的特殊的神奇的web.config文件,是嗎?

[這抓住了我至少每月一次]

+0

不要那個文件仍然完好無損,但歡呼的想法。最後,我發現問題的原因,如果不是解決方案。還有什麼想法? http://stackoverflow.com/questions/3550244/asp-net-mvc-strongly-typed-view-compilation-error/3550857#3550857 – 2010-08-23 19:11:32