2013-02-14 71 views
0

在我的控制器我有一个名为“目标数据”类,它包含一个ID和一个字符串:剃刀视图中的自定义类?

public class ObjectData 
{ 
    public int ObjectId { get; set; } 
    public string Name { get; set; } 
} 

我想这些列表传递给通过ViewBag的观点,但我不知道如何遍历数组中的项,因为类型不正常。我这样做是因为我不想将一堆对象及其数据传递给视图,因为我只需要ID和名称(这是一个有效的关注点?)。

我想这样的循环通过:

foreach (ObjectData i in ViewBag.ParentSetIds) 
{ 
    @Html.ActionLink(i.Name, "Detail", new { objectId = i.ObjectId }, null) 
} 

但剃刀不识别类类型。这如何实现?

回答

1

您必须完全限定就行了你的类型名称:

foreach (Put.Your.Namespaces.Here.ObjectData i in ViewBag.ParentSetIds) 

剃刀不要使用相同的using宣布为你的控制器。您可以在View目录中使用web.config来添加这样的名称空间,而不是每次都完全限定它。

关于如果你应该关心传递这样的对象来查看的问题。不,不需要担心。我建议将对象ObjectData从控制器移动到名为ModelViewViewModel的控制器文件夹旁边的文件夹,并在此处创建类。这就像公开接受的“黑客”一样,拥有代表某种“真实”模型的另一种观点的模型。这与您为您生成的文件AccountModels.cs生成的MVC3项目相同,它包含完全相同的模型。但是您可以在Model文件夹中找到它,但可能会讨论它是否应该在ViewModel文件夹中。另外,如果数据不是真的只是帮助数据,那么将这些数据作为模型传递给ViewBag。

+0

我不完全同意这里的两件事。首先,“剃须刀不使用相同的使用声明”是不正确的。你的Razor视图中有一个'@ using'指令。此外,ViewModels不是“公认的黑客”。我会说他们是“普遍接受的设计决定”。 – 2013-02-15 01:12:26

0

你可以使用:

foreach (var i in ViewBag.ParentSetIds) 

,让编译器确定基于该ViewBag.ParentSetIds

0

在我的控制器我有一个称为“目标数据”的命名空间包含 的ID和字符串:

等等,什么?你为什么在你的控制器上有一堂课?

我想这些列表传递给通过ViewBag认为,

只需使用一个视图模型。如果你是,你可以让它成为List<ObjectData>的一部分。在你的控制器中,你加载该列表(让我们称之为ObjectDataList),并将它发送到你的视图。

在视图(剃刀),你会碰到这样的:

@model MyProject.MyModel 

@foreach(var i in Model.ObjectDataList) 
{ 
    @Html.ActionLink(i.Name, "Detail", new { objectId = i.ObjectId }, null) 
} 

编辑:

为了澄清,你的视图模型可能是:

public class MyModel 
{ 
    public string Title {get;set;} 
    public List<ObjectData> ObjectDataList {get;set;} 

}