代码之家  ›  专栏  ›  技术社区  ›  oglester

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

  •  6
  • oglester  · 技术社区  · 17 年前

    我想将几个(在本例中为2)稍微不同的数据块传递给一个视图。我最初的想法是简单地将各种对象包装成一个包含对象,并以这种方式传递它们。那么从这个角度来看,我会有

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

    3 回复  |  直到 17 年前
        1
  •  11
  •   David P    17 年前

    我发现创建专用于视图的其他类很有用。我将它们保存在一个名为“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>
    

    通过这种方式,在视图中,我可以使用Intellisense并轻松地浏览项目。

        2
  •  1
  •   Tim Scott    17 年前

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

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

        3
  •  1
  •   user1228 user1228    17 年前

    我也有同样的交易。这是我的解决方案(可能不是最佳实践,但它对我有效)。

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

    和一个工厂对象来创建它们(为了利用类型推断…一些TFirsts和TSeconds以及Tthird可以很长)

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

    它给我的类型安全和智能感与最小的麻烦。它之所以有味道,是因为您将本质上没有实际关系的类分组到一个对象中。我想扩展ViewPage类来添加第二个和第三个ViewModel可能会更好,但我这样做所需的工作量要少得多。