2013-02-14 72 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;} 

}