2008-10-26 106 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

相关问题