Как обеспечить главные страницы ASP.NET MVC2 моделью, независимой от контроллера - PullRequest
3 голосов
/ 26 октября 2010

Я использую строго типизированные представления и автофак для Dependency Injection в ASP.NET MVC2, и я пытаюсь получить общий динамический заголовок через внедрение зависимостей. То есть я хочу, чтобы это происходило без необходимости просмотра существующего контента, и я надеялся избежать статического обнаружения контейнера и ручного разрешения, но я не могу найти способ легко добавить мастер или частичное представление в комплекте в мастере с помощью ctor или внедрения свойств.

Я не могу себе представить, что это необычная задача, но все, что я могу найти в терминах методов, это создание подклассов контроллера для помещения данных в нетипизированные ViewData, создание подклассов ViewModels для добавления основных данных в модель или статическое разрешение, и все Я бы предпочел не использовать. Что я пропускаю?

РЕДАКТИРОВАТЬ : Как уже указывалось, DI на главных страницах борется с фреймворком. Так что мой вопрос плохо сформулирован: меня не интересует DI на главных страницах, но у меня есть динамический элемент в хроме сайта, то есть главная страница. Обеспечение его моделью не должно быть обязанностью каждого контроллера, использующего этот мастер, так как это контекст запроса, а не конкретный контекст контроллера. Я полностью признаю, что вставка непосредственно в главные страницы неуместна. Если бы я мог зарегистрировать отдельный главный контроллер, который будет вызываться дополнительно, это было бы еще лучше. Это возможно? С учетом этой задачи предоставления мастеру модели, независимой от контроллера, каков подход, соответствующий структуре? Или общий контент в MVC требует, чтобы каждый контроллер знал об этом контенте?

Ответы [ 2 ]

7 голосов
/ 26 октября 2010

Вы можете использовать дочерние действия .

Контроллер:

public class MyHeaderController: Controller
{
    private readony IRepository _repository;
    public MyHeaderController(IRepository repository)
    {
        _repository = repository;
    }

    [ChildActionOnly]
    public ActionResult Index() 
    {
        var model = _repository.GetSomeModel();
        return PartialView(model);
    }
}

И где-нибудь на вашей главной странице включить его:

<div><%= Html.Action("Index", "MyHeader") %></div>
0 голосов
/ 26 октября 2010

Ваши проблемы связаны с тем, что вы путаете термин «внедрение зависимостей» и сражаетесь с тем, как работает инфраструктура ASP.NET MVC.

Кроме того, вы используете термин «Внедрение зависимостей» в неправильном контексте. Вы пытаетесь использовать молоток как зубило.

Мастер-страницы и представления в ASP.NET MVC предназначены для использования в качестве шаблонов. Как указано в другом ответе, действия ребенка решат вашу проблему.

Для дальнейшего использования:

Внедрение зависимостей относится к средству настройки параметров, которые нужно внедрить в конструкторы классов, и делает это автоматически для вас, переопределяя некоторые из настроек по умолчанию. Цель этого состоит в том, чтобы отделить компоненты, чтобы они стали более пригодными для повторного использования, более проверяемыми, более унитарными, среди других хороших вещей.

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

То, что вы пытаетесь сделать, просто невозможно. То есть через конструкторы и свойства внедрить «зависимость» в мастер-страницу. Опять же, MasterPages предназначены для ASP.NET MVC для использования в качестве простых шаблонов. У них нет кода позади класса для создания экземпляра через конструктор, который позволял бы вставлять в него зависимости.

Другими словами, вы боретесь с фреймворком, а это значит, что вы его не понимаете.

Если это звучит как придирки, я думаю, что это должно быть выделено иначе, вы путаете себя и других, кто читает эту ветку в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...