ASP.NET MVC2 - Пользовательские свойства на ViewPage - PullRequest
3 голосов
/ 20 октября 2010

То, что я думал, должно быть довольно простым поиском, оказалось намного больше.

Atm Я использую базовый класс (MasterModel) для всех моих Моделей, которые затем передаются из ViewPage для ViewMasterPage и все работает нормально.Это было сделано таким образом после прочтения поста «Скоттом Гу».

Затем я подумал о наследовании от ViewPage и расширении Фабрики или того места, где когда-либо был построен ViewPage ... но потом я заблудился.

Кто отвечает за создание экземпляров ViewPage, ViewMasterPage и ViewUserControl.

Проблема более или менее в том, что я использую экземпляр того же класса на 99% всех страниц и всегда наMasterPage, так что трудно постоянно передавать его в модели.

Это даже правильный путь, или у вас, ребята, есть другие предложения?

Обновление

Мне нужно иметь возможность вставлять сложные типы, взятые из моего IOC (StructureMap), в конструктор ViewPage, так что будет легко изменить реализацию.Вот почему я ищу место, где строится ViewPage.

Ответы [ 3 ]

2 голосов
/ 21 октября 2010

Можете ли вы посмотреть на использование MVC3?Внедрение зависимостей в страницы просмотра невозможно, поскольку создание скрыто глубоко внутри реализации механизма представления.

Теперь это решено в MVC3.Полная информация: http://bradwilson.typepad.com/blog/2010/07/service-location-pt3-views.html

0 голосов
/ 21 октября 2010

Я бы бросил модель базового вида и DI в ViewPage, чтобы использовать вместо этого композицию (через ViewData []), потому что она дает вам гораздо большую гибкость, чем наследование моделей представления. Представьте себе, если позже вы захотите добавить дополнительные компоненты (заголовок, меню, боковую панель, виджет профиля пользователя и т. Д.) На различные страницы. Если вам придется вписать все это в модель базового вида, она будет переполнена, и вам, вероятно, даже не понадобится все в каждом представлении. Я использую модель исключительно для конкретного визуализируемого представления, а затем помещаю мои другие компоненты в ViewData. Пример просмотра кода:

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

Или супер простое решение: вы рассматривали возможность использования ObjectFactory на ваш взгляд? (Это заставило бы некоторых людей - включая и меня - съежиться, но это работает.)

ObjectFactory.GetInstance<IService>();
0 голосов
/ 20 октября 2010

Насколько я понимаю, вы несете ответственность, потому что в определении своего Представления вы конкретно указываете, каков базовый класс вашего представления.

Попробуйте это:

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> {}
...