我对ASP.NET MVC和MVC模式有点新意,但我真的在挖掘这个概念以及我可以快速构建应用程序。我正在努力的一件事是如何将多个对象暴露给视图。我使用了很多强类型视图,这种视图效果很好但是如果我的视图依赖于多个对象呢?现在我正在做一些非常hacky并将Dictionary传递给视图,然后只是键入不同的对象。对此有更好的模式吗?
答案 0 :(得分:8)
您有两个主要选项,可以根据您的应用程序正常运行。
1)只需将对象放入ViewData集合中即可。如果您有许多不同的控制器将不同的数据传递给不同的视图,这很有效。它还取决于您将对象强制转换为正确类型时对象的装箱/拆箱量。此选项更灵活,但类型安全性更低,可能更脆弱。
2)创建强类型对象,其中包含对一组视图有用的其他强类型对象。如果您倾向于将相同的数据传递到大多数视图并且控制器较少,则此方法很有效。
您还可以考虑传递一个公开接口的对象,该接口可以获取不同的模型对象(一种定位器类),但这可能会导致比修复它们更多的问题。
答案 1 :(得分:4)
在控制器中创建一个嵌套类。
public class WhateverControllerViewData
{
public ObjectA ObjectA {get;set;}
public ObjectB ObjectB {get;set;}
}
在ActionMethods中分配给他们
{
var wcvd = new WahteverControllerViewData;
wcvd.ObjectA = whatever;
..
Return View(wcvd);
}
然后在您的视图中使用它
<%= ViewData.Model.ObjectA.Whatever %>
确保使用嵌套类作为类型创建强类型视图。
答案 2 :(得分:3)
您只需将每个对象存储在ViewData中,然后在视图中投射相应的对象类型。
控制器:
ViewData["ObjectA"] = objectA;
ViewData["ObjectB"] = objectB;
查看:
<%= ((ObjectA)ViewData["ObjectA"]).PropertyA %>
<%= ((ObjectB)ViewData["ObjectB")).PropertyB %>
或更好,
<%
var objectA = (ObjectA)ViewData["ObjectA"];
var objectB = (ObjectB)ViewData["ObjectB"];
%>
<%= objectA.PropertyA %>
<%= objectB.PropertyB %>
答案 3 :(得分:2)
我会设计你的模型来包含你的各种对象类型:
public class TheModel {
public DataClassA DataTypeA { get; set; }
public DataClassB DataTypeB { get; set; }
}
这消除了转换和字典对象等。
答案 4 :(得分:0)
使用 ViewData 集合将对象传递给视图。您可能希望传递一个Controller,而不是模型的1对1对象。
答案 5 :(得分:0)
如何在ViewData.Model中使用匿名类型?
答案 6 :(得分:0)
元组对象也可用于此目的, 元组&lt; Type1,Type2&gt; typleObject 但是,只要您可以定义属性名称
,就更喜欢强类型容器对象