2010-08-09 47 views
1

我正在通過http://weblogs.asp.net/scottgu/archive/2007/11/13/asp-net-mvc-framework-part-1.aspx上的ASP.NET MVC文章。 (注:有些在這篇文章的結構在MVC 1個RTM就被拋棄了,所以我改變相應的代碼也許這就是我的問題。)ASP.NET MVC查看拋出CS1061錯誤與作爲ViewDdata傳遞給視圖的模型對象的類型相關

在我的LINQ to SQL的.dbml(在MYDB .designer的.cs)Category類(生成的編譯器)被定義如下:

​​

以我控制器I類定義一個類別的操作方法如下:

public ActionResult Categories() // /Products/Categories/ maps here 
{ 
    List<Category> categories = northwind.GetCategories(); 
    return View("Categories", categories); 
} 

我然後創建一個Categories.aspx其強類型爲「MVC_ Basics_1.Models.Category「將

<%@ ... Inherits="System.Web.Mvc.ViewPage<MVC_Basics_1.Models.Category>" %> 

行放在文件的頂部。

最後,在.aspx我:

<% foreach (var category in ViewData) { %> 
    <li> 
     <%= Html.ActionLink(category.CategoryName, new { action="List", category=category.CategoryName }) %> 
    </li> 
<% } %> 

兩個問題:

首先,當我瀏覽到/產品/分類/我的錯誤:

編譯器錯誤消息: CS1061:'System.Collections.Generic.KeyValuePair'不包含'CategoryName'的定義,並且沒有接受類型'System.Collections.Generic.KeyValuePair'的第一個參數的擴展方法'CategoryName'可能是fou nd(您是否缺少使用指令或程序集引用?)

並且類別視圖數據對象不能識別Category類的任何屬性。

我錯過了什麼?其次,控制器的Category()操作方法返回一個類別列表(鍵入爲「List categories」)作爲視圖的viewdata,但視圖的ActionLink輔助方法引用「category.CategoryName」。這對我來說沒有任何意義,因爲我傳遞的是類別實例(而不是類別)作爲類型。由於控制器的操作方法正在返回一個列表,這不表示該視圖需要輸入類別?

UPDATE:

我在的問題,在我的方法來實現這一個缺陷。我更關注錯誤,並將我的結果與我閱讀的文章比較,而不是我實際的目標 - 有點像沒有通過樹木看到森林。當我想到我實際上想要完成的事情 - 將模型數據傳遞給視圖時 - 我停止了有關語法錯誤的事情,並開始考慮(a)我想要在控制器中創建的特定對象,以及(b) (s)我想傳遞給視圖的數據。一旦我通過樹木看到森林,答案就變得很明顯。 @Ufuk和@ryk幫助我認識到了這一點。

+0

@Ryk - 這在計算似乎離 - 我有22個問題,只有3沒有接受的答案。 – Howiecamp 2010-08-09 04:35:52

+0

@ryk - 我理解檢查vs投票。查看我的評論和個人資料。只有3或4個不被接受。 – Howiecamp 2010-08-09 05:38:08

+0

@ryk - 我意識到我的問題存在缺陷。我正在更新它,請檢查出來。謝謝。 – Howiecamp 2010-08-12 14:21:22

回答

3

您應該強烈地將視圖輸入列表,而不是僅限於模型。

<%@ ... Inherits="System.Web.Mvc.ViewPage<IEnumerable<MVC_Basics_1.Models.Category>>" %> 

這應該解決你的兩個問題,我猜。首先你不能用foreach瀏覽它,因爲你的模型沒有實現IEnumerable。第二個List<Category>實例是列表,如果你想使用Category類的屬性,你必須引用一個成員。

更新

。在你查看一個問題太多。你是你查看發送列表模式,而不是在ViewData.Change這樣的:

<% foreach (var category in Model) { %> 
    <li> 
     <%= Html.ActionLink(category.CategoryName, new { action="List", category=category.CategoryName }) %> 
    </li> 
<% } %> 
+0

我得到完全相同的錯誤。好奇的是,當我創建視圖並選擇強類型時,我選擇「MVC_Basics_1.Models.Category」。爲什麼不是列表框給我選擇列表而不是類別的選項? – Howiecamp 2010-08-09 04:32:24

+0

很奇怪 - 我輸入代碼,是從文章中,用類似的RenderView變化的異常(...)有利於返回查看(...)被棄用。現在我已經按照您的建議指定了>,還需要更改哪些內容? – Howiecamp 2010-08-09 04:39:10

+0

我意識到另一個錯誤。請參閱更新。對於另一個問題:我不確定。 Intellisense通常在模型中提供類,但是如果嵌套,則必須指定地點。 – 2010-08-09 04:41:28

0
<%@ ... Inherits="System.Web.Mvc.ViewPage<MVC_Basics_1.Models.Category>" %> 

需求是

<%@ ... Inherits="System.Web.Mvc.ViewPage<List<MVC_Basics_1.Models.Category>>" %> 

你需要使用「模式」在地方的ViewData的。

<% foreach (var category in model) { %> 
    <li> 
     <%= Html.ActionLink(category.CategoryName, "List", new {category= category.CategoryName }) %> 
    </li> 
<% } %> 

ViewData的是一個哈希表,使用鍵值對,所以通過ViewData的迭代會給你在哈希表中的每個對象,而不是你的模型,你聲明並傳遞到視圖。

+0

IEnumerable等接口是更好的選擇。 – 2010-08-09 04:50:01

+0

@ Benjamin-I將ViewData更改爲「模型」並更改了繼承。 「模型」在哪裏定義?此外,該文章提到「ViewData」與「模型」,因爲文章寫作時與MVC 1 RTM之間有所變化?最後,奇怪的是我現在已經失去了可視性Html.ActionLink:「編譯錯誤:CS1928:‘System.Web.Mvc.HtmlHelper >’不包含一個定義對於「ActionLink的」和最佳推廣方法重載「System.Web.Mvc.Html.LinkExtensions.ActionLink(System.Web.Mvc.HtmlHelper,字符串,字符串)」有一些無效參數」。 – Howiecamp 2010-08-09 04:53:05

+0

@Howiecamp:我糾正了ActionLink參數。它應該現在工作 – 2010-08-09 05:05:31

1

我有這個問題一次,我經過一個整數值作爲ActionLink的方法的第一個參數(當預期值是一個字符串),所以我得到這個錯誤這是用於輸入錯誤的參數的數據類型而引起的。我只是將參數轉換爲字符串,它的工作(即:myModel.integerProperty.ToString())。

希望這對一些人有幫助。

相關問題