如何将多个对象传递给ASP.NET MVC中的ViewPage?

时间:2008-10-26 18:46:16

标签: asp.net-mvc

我想我知道答案,但我想反思一些想法。

我想将几个(在这个例子中为2个)一些不同的数据传递给View。我最初的想法是简单地将各种对象包装成一个包含对象并沿着这种方式传递它们。然后从视图中,我有类似

的东西
var objContainer = ViewData.Model;
var thisObject = objContainer.ThisObject;
var thatObject = objContainer.ThatObject;

,这些可以在母版页和查看页面中单独使用。

这是“最好的”方式吗?

3 个答案:

答案 0 :(得分: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; }
    }
}

然后我确保我的View是一个强类型视图,它使用该表示类的通用版本:

public partial class Search : ViewPage<SearchPresentation>

在View中,我可以使用Intellisense轻松浏览项目。

答案 1 :(得分: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);
 }    
/*...*/
}

它给了我类型安全和智能感知,并且最小化。它只是闻起来,因为你将基本上没有真正关系的类分组到一个对象中。我想扩展ViewPage类以添加第二个和第三个ViewModel可能会更好,但是我这样做的方式要少得多。

答案 2 :(得分:1)

是的,您指定为模型的类可以由其他类组成。但是,为什么不直接使用字典:

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

我认为这比将模型定义为其他不相关对象的容器更可取,这对我来说有一种有趣的气味。