【问题标题】:How do I pass multiple objects to ViewPage in ASP.NET MVC?如何在 ASP.NET MVC 中将多个对象传递给 ViewPage?
【发布时间】:2010-09-19 07:13:21
【问题描述】:

我想我知道答案,但我想围绕一些想法来思考一下。

我想向视图传递几个(在本例中为 2)略有不同的数据。我最初的想法只是将各种对象包装成一个包含对象并以这种方式传递它们。然后从视图中,我会有类似

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

这些可以在母版页和视图页中独立使用。

这是“最好”的方式吗?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

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

    这样在视图中,我可以使用 Intellisense 并轻松浏览项目。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 最大的问题是你失去了智能感知和类型安全。另外,您现在在视图和模型之间有了额外的依赖关系(编译器无法强制执行),因为它们都必须知道并理解“foo”和“bar”的含义......
      【解决方案3】:

      我有同样的交易。这是我的解决方案(可能不是最佳做法,但对我有用)。

      我创建了许多“分组”类:

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

      和一个工厂对象来创建它们(利用类型推断......一些 TFirsts 和 TSeconds 和 TThirds 可以是 LONG)

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

      它为我提供了类型安全和智能感知功能,并且无需大惊小怪。它只是闻起来很臭,因为您将它们之间基本上没有真正关系的类组合到一个对象中。我想扩展 ViewPage 类以添加第二个和第三个 ViewModel 可能会更好,但我这样做的方式需要更少的工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多