是的,這是完全可能的。只需創建一個包含將由存儲過程進行填充,然後傳遞到您的視圖屬性視圖模型:
public class PeopleViewModel
{
public List<Job> Jobs { get; set; }
public List<Name> Names { get; set; }
}
然後操作方法:
每評論
public ActionResult Index()
{
var model = new PeopleViewModel();
model.Jobs = // ... fetch from database
model.Names = // ... fetch from database
return View(model);
}
更新
正如你所說的Jobs
和Names
是集合,你顯示的模型代碼不會解決你的問題。這聽起來像這是你真正想要的:
public class Job // Notice I've removed the pluralisation
{
public int jobID { get; set; }
public string jobName { get; set; }
}
public class Name // Notice I've removed the pluralisation
{
public int userId { get; set; }
public string userName { get; set; }
}
現在,您People
類可以包含這些列表:
public class People
{
public List<Job> Jobs { get; set; }
public List<Name> Names { get; set; }
}
現在你可以在一個視圖模型把這個包:
public class PeopleViewModel
{
public People People { get; set; }
}
然後你會從你的動作中填充它:
public ActionResult Index()
{
var model = new PeopleViewModel();
model.People = // ... fetch from database
return View(model);
}
問題是,如果Jobs
和Names
是不相關的,那麼首先將它們包裝在People
類中是毫無意義的。你只需做以下(如上所述):
public class PeopleViewModel
{
public List<Job> Jobs { get; set; }
public List<Name> Names { get; set; }
}
認爲一個視圖模型爲代表只是一個你想在視圖中顯示的數據,僅此而已,無所不及的切片的方式。上面所有的代碼都定義了你希望在該視圖中看到的數據。由於視圖模型上的屬性是公共的,您可以使用您當前使用的任何方法將它們填充到控制器的操作中。
第二次更新
我認爲這可能會有助於您展示一個完整的例子來爲如何你的意見裝配在一起。首先,我將向您展示訪問視圖模型中數據的快速和骯髒的方法,然後我會告訴您如何在DisplayTemplates
中執行相同的操作。
快速和骯髒的方法
信息首先,假設我們有一個動作叫Index
類似如下:
public ActionResult Index()
{
var model = new PeopleViewModel();
model.Jobs = // ... fetch from database
model.Names = // ... fetch from database
return View(model);
}
這裏的Index
觀點:
@model PeopleViewModel
@foreach (var job in Model.Jobs)
{
@Html.DisplayFor(m => job.JobId)
@Html.DisplayFor(m => job.JobName)
}
@foreach (var name in Model.Names)
{
@Html.DisplayFor(m => name.UserId)
@Html.DisplayFor(m => name.UserName)
}
注意如何view期望PeopleViewModel
的一個實例,它只是循環遍歷每個集合中的每個單獨的項目,打印t他的內容。然而,雖然對於非常簡單的視圖來說這很好,但將HTML與HTML混合成爲一個維護頭痛,並且視圖更復雜,項目也更大。考慮到這一點,我們可以改用DisplayTemplates
。
第二種方法 - 使用模板
在你的控制器的操作保持不變。但是,我們需要做一些其他更改。我們正在努力的方向是轉動Index
視圖這個:
@model PeopleViewModel
@Html.DisplayFor(m => m.Jobs)
@Html.DisplayFor(m => m.Names)
通過這種方式調用Html.DisplayFor
,它會嘗試找到一個DisplayTemplate
相當於它被傳遞的數據類型。在這種情況下,助手足夠聰明,知道我們正在將集合傳遞給它,因此它將查找與集合包含的數據類型相匹配的模板。這意味着我們需要爲Job
和Name
類型創建模板。要做到這一點,請按照下列步驟操作:
- 創建視圖的當前文件夾內的文件夾
DisplayTemplates
(例如,如果你的觀點是Home\Index.cshtml
,創建文件夾Home\DisplayTemplates
)。
- 在該目錄中創建一個與您的模型匹配的名稱的強類型視圖(即在這種情況下,您將創建兩個視圖,分別稱爲
Job.cshtml
和Name.cshtml
)。
現在您可以將所有顯示邏輯移動到這兩個模板中。因此,他們看起來像以下:
Job.cshtml
@model Job
@Html.DisplayFor(m => m.JobId)
@Html.DisplayFor(m => m.JobName)
Name.cshtml
@model Name
@Html.DisplayFor(m => m.UserId)
@Html.DisplayFor(m => m.UserName)
希望這將清除的東西了一點。
我認爲最好的做法是創建一個新的ViewModel,它需要兩個ViewModel作爲屬性。新的ViewModel就是你傳遞給View的東西。 – rikitikitik