2010-03-03 61 views
1

一個視圖接受一個模型。 但我需要爲兩個模型繪製HTML輸入控件。 一個例子將說明:當View需要多個Model時,如何優雅地編程ASP.NET MVC?

我有一個屏幕,我添加Employees。 添加他們的名字,姓氏等等之後,我需要用戶選擇一些員工可以在的公司。

這些公司在一張桌子上。 僱員在另一個。 並且一個鏈接表連接它們。

所以看來我需要通過公司的觀點。 我可以將多個模型傳遞給視圖嗎? 或者我必須在視圖中進行醜陋的數據庫查找以查找公司,並且手動吐出沒有HTML助手的複選框的HTML?

+0

我相信這是用戶控制派上用場。 – 2010-03-03 05:42:05

+0

這是否意味着我應該創建一個用戶控件來繪製一排複選框? – Petras 2010-03-03 06:03:32

回答

6

模型不一定只包含一個對象或一個對象類型的單個集合。它可以包含許多對象和/或對象集合。看起來您的頁面所需的模型至少包括兩個員工公司的集合。如果您的商業對象抽象中沒有適合此法案的類型,那麼您需要爲此頁面創建一個ViewModel來完成這項工作。

這個答案可能有助於解釋一個ViewModel在MVVM ViewModel vs. MVC ViewModel

+0

這是我過去的做法。然後,如果視圖具有采用這些「子」視圖模型之一的局部視圖,那麼只需調用Model.PartialModel即可直接傳遞給它們,它仍然是強類型的:-) – WestDiscGolf 2010-03-03 09:38:23

0

這並不完全是顯而易見的是如何適應 - 我敢肯定,這是一些大師類型但對我們其餘的人想工作的事情了其位更有意思的。

沒有進入細節我看到了一些解決這個辦法:

  1. 你需要這兩組數據,所以你需要特定視圖模型視圖
  2. 你的模型是員工,但你仍然可以添加其他數據到ViewData - 所以使Employee成爲模型並傳遞公司數據以及查看數據,但不是模型的一部分
  3. (無論您使用何種模型,您都可能想要這樣做)Render the company選擇元素作爲一個單獨的視圖 - 這是事情變得有趣的地方 - 你顯然必須通過現有的選擇,或一種手段來識別相同的組件視圖,但是您是否必須通過公司列表,或者您可以在這一點上作弊(prgamatically)?我的感覺是這是一個局部視圖,你需要傳遞一個公司選擇模型(公司列表中有選擇的公司名單),但是你理論上可以做RenderAction並且有一個操作返回一個公司選擇的視圖對於指定的員工 - 這樣整體視圖永遠不會看到公司數據,這成爲一個單獨的封裝問題 - 至少在加載數據方面。

我認爲在這種情況下,你要添加的員工要麼調整模式或增加公司名單作爲補充數據到ViewData的就足夠了,但對於編輯 - 假設其所需的 - 而不是插入你想公司選擇名單(所有公司的標誌,以表明目前選擇),而不僅僅是一個公司的名單,在這一點上,它都得到了一點更有趣