Razor View中的自定义类?

时间:2013-02-14 23:05:29

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

在我的Controller中,我有一个名为“ObjectData”的类,它包含一个ID和一个字符串:

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

我正在尝试通过ViewBag将这些列表传递给视图,但我不知道如何遍历数组中的项目,因为classtype不正常。我这样做是因为我不想将一堆对象及其数据传递给视图,当我只需要ID和名称时(这是一个有效的问题吗?)。

我正在考虑像这样循环:

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

但Razor不承认该类型。如何实现这一目标?

3 个答案:

答案 0 :(得分:1)

您必须在行上完全限定您的姓名:

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

Razor不会使用与您的控制器相同的using声明。您可以在View目录中使用web.config添加此类命名空间,以便不是每次都完全限定它。

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

答案 1 :(得分:0)

您可以使用:

foreach (var i in ViewBag.ParentSetIds)

让编译器根据ViewBag.ParentSetIds

确定命名空间

答案 2 :(得分:0)

  

在我的控制器中,我有一个名为“ObjectData”的   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;}

}