Логика MVC: для просмотра требуется больше данных - PullRequest
3 голосов
/ 14 ноября 2011

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

На мой взгляд, MVC должен разделить три части веб-приложения: Модель (работа с данными: выборка, изменение и т. Д.), Контроллер (решение, какие данные возвращать в качестве ответа в зависимости от пользователя). request) и View (преобразование данных, полученных от контроллера (например, в HTML) для отправки обратно пользователю в качестве ответа).

«Разделение» означает, что эти три элемента являются абстрактными друг от друга. Контроллер не заботится о деталях реализации части Модели (и наоборот), он просто сообщает, какие данные ему нужно получить (или изменить), и знает, как их обрабатывать, Модель не имеет ничего общего с представление (то есть способ преобразования данных). Наконец, Контроллер не имеет ничего общего с преобразованием View, он просто знает, какие данные необходимо преобразовать (в зависимости от запроса) и каким образом (например, выбирая правильный шаблон для текущих данных). А часть View абстрагирована от контроллера, ее задача - преобразовать определенный массив входных данных некоторым заданным способом.

Итак, скажем, у меня есть веб-сайт. Он имеет индексную страницу (/) и некоторые неиндексированные страницы (/ вакансия /, / about /, / Articles / Bytag / Fun / 5 / и т. Д.). Вверху каждой страницы есть логотип. Проблема в том, что я хочу, чтобы логотип был гиперссылкой на страницу индекса на каждой странице моего сайта, кроме самой страницы индекса (поскольку я не хочу, чтобы мои страницы содержали гиперссылки на себя). Поэтому я хочу, чтобы "image" на странице индекса и " image " на других страницах.

Конечно, я не хочу повторяться и создавать несколько шаблонов (header_index и header_nonindex) с одним и тем же изображением логотипа. Итак, что мне нужно сделать, это проверить, нахожусь ли я на странице индекса в каком-то месте моего шаблона (то есть внутри части просмотра) и в зависимости от результата добавлять или не добавлять тег ссылки.

И здесь я сталкиваюсь с логической проблемой. Я не могу получить адрес в представлении (поскольку по логике эта часть не имеет ничего общего с запросом пользователя, она преобразует данные, полученные из контроллера). Поэтому мне нужен мой контроллер для отправки определенных данных (например, адрес страницы или логическое значение, как "isIndex") в представление. Но представление не может «требовать» данные от контроллера, представление - это просто способ преобразования данных. Таким образом, если какая-то конкретная переменная необходима для самого преобразования, добавление ее в контроллер будет делать представление зависимым от конкретного контроллера и контроллера - связанным с конкретным представлением, что нарушит всю идею абстракции и разделения. Таким образом, нет способа сделать то, что мне нужно, не нарушая логику MVC.

В какой части этого я ошибаюсь?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2011

Классическая головоломка, но не особо изолированная для MVC.В ООП вы хотите повысить сплоченность внутри класса и уменьшить связь между классами.MVC поднимает этот же принцип до архитектурного уровня, каждый компонент отвечает за свою деятельность, но отделен от действий двух других.Это идеальная ситуация, но, как и в ООП, идеальный не подразумевает абсолютного разделения.Они совместно используют некоторые данные - контроллеры получают доступ к моделям объектов, конструируют модели представлений и интерпретируют ввод (обычно как модели в веб-интерфейсе MVC).Представления используют модели представлений и в Интернете являются источником входных данных.Модель, пожалуй, самая изолированная.

Реальность такова, что разделение - это не абсолют, а континуум.Вы более или менее разделены по сравнению с другими архитектурными образцами.MVC, как правило, находится на «более» разделительной стороне архитектурных шаблонов, но не все реализации MVC или даже экземпляры приложений в этих средах созданы равными в этом отношении.Как говорится, «вы можете писать на Фортране на любом языке», что означает, что вы можете, если захотите, нарушать шаблон проектирования в любой степени, в которой вы хотите, даже в той степени, в которой он искажает другой шаблон.

Это не всегда плохо.Вы должны быть прагматичными об этом.В конце концов, цель состоит не в том, чтобы добиться чисто архитектурной реализации.Цель состоит в том, чтобы выполнить бизнес приложения.В вашем случае у вас есть некоторые цели пользовательского интерфейса, которые требуют, чтобы представление имело доступ к некоторым сведениям о том, какой контроллер его отображает.ASP.NET MVC предоставляет это через свойство ViewContext, которое, в свою очередь, предоставляет ссылку на Controller, RouteData и HttpContext.

Вы можете использовать их для достижения своих бизнес-целей за счетНекоторое искажение архитектурного шаблона, то есть представление теперь обрабатывает некоторый «ввод» и принимает некоторые решения на основе этих значений напрямую.В качестве альтернативы вы также можете выбрать более четкое разделение, увеличив сложность моделей представлений, либо исходя из базовой модели, содержащей некоторые служебные свойства, либо в MVC используйте ViewBag в качестве расширения каждой модели для той же модели.цели.Это увеличивает связь с контроллером, поскольку теперь он должен знать, что представлению нужны эти служебные свойства для правильной визуализации.Опять же, это континуум - вы увеличиваете связь, а не создаете связь там, где ее не было.

Я отказался от идеи создания чистойMVC.Да, я хочу оставаться как можно ближе к парадигмам инфраструктуры MVC.С фреймворком работать легче, чем с ним.Однако, когда у меня есть цель, которая заставляет меня нарушать разделение интересов (после тщательного изучения, чтобы убедиться, что мне действительно нужно), я больше заинтересован в том, чтобы сделать это устойчивым и поддерживаемым способом, чем прыгать через архитектурные обручи ксделать что-то, для чего фреймворк не подходит или лучше всего сделать так, чтобы фреймворк не ожидал.

0 голосов
/ 14 ноября 2011

Вы правы в том, что 3 компонента MVC должны быть разделены, и их цель - сохранить код чистым и разделенным.

Но это не значит, что они независимы. Это не означает, что вы можете взять любой ПРОСМОТР и объединить его с любым КОНТРОЛЛЕРОМ и ожидать, что он будет работать.

И вы всегда можете немного скрутить шаблон, если это будет лучшим решением. В этом случае вам следует использовать глобальные переменные, возможно, статические, которые будут доступны через 3 компонента MVC.

Поэтому, когда вы находитесь в контроллере страницы индекса, сообщите этой статической переменной, что вы находитесь на странице индекса, и для всех других контроллеров установите ее по умолчанию (по умолчанию = вы не находитесь на странице индекса). И тогда вы можете использовать эту статическую переменную в любом представлении, не говоря уже о контроллере.

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