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

6

我想我知道答案,但我想先探讨一些想法。

我想向视图传递几个(在这种情况下是2个)略有不同的数据片段。我的最初想法是将各种对象打包到一个容器对象中并以这种方式传递它们。然后从视图中,我会有类似于:

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

这些可以独立地在主页和视图页中使用。

这是“最佳”方式吗?

3个回答

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>

这样,在视图中,我就可以使用智能感知并轻松浏览项目。


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,但我这样做需要更少的工作。


1

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

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

我认为这比将模型定义为包含其他无关对象更可取,这对我来说有一种奇怪的味道。


1
最大的问题是你失去了智能感知和类型安全。此外,现在视图和模型之间有一个额外的依赖关系(编译器无法强制执行),它们都必须知道并理解“foo”和“bar”的含义... - user1228

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接