ASP.NET MVC2 - ViewPage上的自定义属性

时间:2010-10-20 12:01:23

标签: .net asp.net-mvc-2 factory-pattern

我认为应该是一个相当简单的搜索,结果是更多。

Atm我正在为我的所有模型使用基类(MasterModel),然后从ViewPage传递下来< HomeIndexModel>到ViewMasterPage< MasterModel>一切正常。这是在阅读“Scott Gu”的帖子后以这种方式完成的。

然后我考虑从ViewPage继承并扩展Factory或从哪里构建ViewPage ......但后来我迷路了。

谁负责实例化ViewPage,ViewMasterPage和ViewUserControl。

问题或多或少是因为我在99%的所有页面上使用同一个类的实例并且总是在MasterPage上使用,因此在模型中不断传递它是一件痛苦的事。

这是否是正确的方法,或者你们有任何其他建议吗?

更新

我需要能够将从IOC(StructureMap)中获取的复杂类型注入到ViewPage的构造函数中,因此很容易更改实现。这就是为什么我在寻找构建ViewPage的地方。

3 个答案:

答案 0 :(得分:2)

你能看到使用MVC3吗?视图页面中的依赖注入是不可能的,因为创建深埋在视图引擎的实现中。

现在在MVC3中解决了这个问题。完整详情:http://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.html

答案 1 :(得分:0)

据我了解,您有责任,因为在View的定义中,您明确说明了您的视图的基类。

试试这个:

public sealed class MyViewPage : System.Web.Mvc.ViewPage
{
  public string Herp {get{return "Derp";}}
}

并且,在您看来,这样做:

<%@ Page Language="C#" Inherits="MyApplication.MyViewPage" %>
<!-- compare the Inherits attribute in your standard View page -->
<%: Herp %>

我从来没有这样做,但我90%肯定它会起作用。您还需要执行通用版本:

public sealed class MyViewPage<T> : System.Web.Mvc.ViewPage<T> {}

答案 2 :(得分:0)

我将基本视图模型和DI放弃到ViewPage中以使用合成(通过ViewData []),因为它允许您比继承视图模型更灵活。想象一下,如果您以后想要向各种页面添加更多组件(标题,菜单,侧边栏,用户配置文件小部件等)。如果你必须将所有这些都融入到基本视图模型中,那么它将变得拥挤,你可能甚至不需要每个视图上的所有内容。我纯粹为渲染的特定视图使用该模型,然后将我的其他组件放入ViewData。示例视图代码:

<% var headerModel = ViewData[Constants.HeaderData] as HeaderViewModel %>

或超级简单的解决方案:您是否考虑在视图中使用ObjectFactory? (这会让一些人 - 包括我自己 - 畏缩,但确实有效。)

ObjectFactory.GetInstance<IService>();