2008-10-26 68 views
6

我想我知道答案,但我想圍繞一些想法反彈。如何在ASP.NET MVC中將多個對象傳遞給ViewPage?

我想通過幾個(在這種情況下2)有點不同的數據片段視圖。我最初的想法是簡單地將各種對象包裝到一個包含對象中,並沿着這個方向傳遞它們。然後從視圖中,我會有類似於

var objContainer = ViewData.Model; 
var thisObject = objContainer.ThisObject; 
var thatObject = objContainer.ThatObject; 

這些可以在母版頁和查看頁面中獨立使用。

這是「最好的」方式嗎?

回答

11

我覺得有必要創建一些專門用於呈現視圖的類。我把它們放在一個名爲'Core.Presentation'的單獨命名空間中,以保持組織性。這裏有一個例子:

namespace Core.Presentation 
{ 
    public class SearchPresentation 
    { 
     public IList<StateProvince> StateProvinces { get; set; } 
     public IList<Country> Countries { get; set; } 
     public IList<Gender> Genders { get; set; } 
     public IList<AgeRange> AgeRanges { get; set; } 
    } 
} 

然後我要確保我的看法是,它使用呈現類的通用版本一個強類型的視圖:

public partial class Search : ViewPage<SearchPresentation> 

中認爲,這樣,我可以使用智能感知並輕鬆瀏覽項目。

1

我得到了同樣的生意。這是我的解決方案(可能不是最佳做法,但適用於我)。

我創造了多項「分組」類:

public class Duo<TFirst,TSecond> { /*...*/ } 
public class Trio<TFirst,TSecond, TThird> { /*...*/ } 

和工廠對象來創建它們(利用類型推斷......一些TFirsts和TSeconds和TThirds的可長)

public static class Group{ 

public static Duo<TFirst, TSecond> Duo(TFirst first, TSecond second) { 
    return new Duo<TFirst, TSecond>(first, second); 
}  
/*...*/ 
} 

它給我類型安全和intellisense與最小的大驚小怪。它只是因爲你將基本上沒有真正關係的類組合到一個對象中而聞名。我想最好是擴展ViewPage類來添加第二個和第三個ViewModel,但是我這樣做的方式需要很少的工作。

1

是的,您指定爲模型的類可以由其他類組成。但是,爲什麼不直接使用字典,像這樣:

ViewData["foo"] = myFoo; 
ViewData["bar"] = myBar; 

我覺得這是最好定義模型作爲不相關對象的容器,這對我有怪味。

+1

這最大的問題是你失去了智能感知和類型安全。另外,你現在在視圖和模型之間有一個額外的依賴關係(編譯器不能強制執行),因爲它們都必須知道和理解「foo」和「bar」的含義。 – Will 2008-10-26 19:00:47

相關問題