2010-08-09 52 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())。

希望这对一些人有帮助。

相关问题