2013-10-01 71 views
6

我無法理解這是否可行。我有一個存儲過程和視圖模型類和一個控制器。是否有可能使用不同的存儲過程添加另一個視圖模型類以使用一個控制器並將來自兩個存儲過程的信息顯示在一個視圖中?我可以在單個控制器中使用兩種視圖模型嗎?

這是我目前型號:

public class People 
{ 
    public class Jobs 
    { 
     public int jobID { get; set; } 
     public string jobName { get; set; } 
    } 

    public class Names 
    { 
     public int userId{get;set} 
     public string userName {get; set;} 
    } 
} 
+3

我認爲最好的做法是創建一個新的ViewModel,它需要兩個ViewModel作爲屬性。新的ViewModel就是你傳遞給View的東西。 – rikitikitik

回答

12

是的,這是完全可能的。只需創建一個包含將由存儲過程進行填充,然後傳遞到您的視圖屬性視圖模型:

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); 
} 

更新

正如你所說的JobsNames是集合,你顯示的模型代碼不會解決你的問題。這聽起來像這是你真正想要的:

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); 
} 

問題是,如果JobsNames是不相關的,那麼首先將它們包裝在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相當於它被傳遞的數據類型。在這種情況下,助手足夠聰明,知道我們正在將集合傳遞給它,因此它將查找與集合包含的數據類型相匹配的模板。這意味着我們需要爲JobName類型創建模板。要做到這一點,請按照下列步驟操作:

  1. 創建視圖的當前文件夾內的文件夾DisplayTemplates(例如,如果你的觀點是Home\Index.cshtml,創建文件夾Home\DisplayTemplates)。
  2. 在該目錄中創建一個與您的模型匹配的名稱的強類型視圖(即在這種情況下,您將創建兩個視圖,分別稱爲Job.cshtmlName.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) 

希望這將清除的東西了一點。

+0

因此,目前我有一個PeopleModel.cs模型文件,在其中我有'公共類作業',我有'公共類名稱'我怎樣才能把它們融入到一個? – Masriyah

+0

@Masriyah他們是收藏品還是單品? –

+0

他們是集合 – Masriyah

相關問題