Является ли html.renderaction кодом запах
Недавно я начал новую работу, в которой меня поручили исправлять ошибки в разрабатываемом приложении ASP.Net MVC. Я большой поклонник использования подхода MVC для веб-приложений и создания некоторых здоровенных производственных приложений на Maverick.Net, начиная с 2004/2005 гг., Однако я впервые использую ASP.Net MVC Framework для чего-то иного, кроме как шутить.
Одна вещь, которую я часто делаю с исправлением ошибок, это погоня за цепочками контроллеров после вызовов html.renderaction. В прошлом, когда я писал приложения для MVC, единый контроллер отвечал за создание модели целиком. Если бы были общие разделы или функции для каждого контроллера, они были бы подклассифицированы, перемещены на уровень доступа к данным. Мне кажется, что в этом случае, и я подозреваю других, что наличие html.renderaction будет поощрять какой-то серьезно спагетизированный код и на самом деле побеждает цель иметь отдельные этапы CMV, поскольку теперь он становится CMVCMVCMV и т. Д.
Является ли html.renderaction действительно лучшим способом поощрения чистого кода, мне это кажется немного вонючим?
4 ответа
Еще немного поработав над проектом и с помощью инфраструктуры ASP.NET MVC, я пришел к выводу, что RenderAction не следует использовать в производственном коде (возможно, есть исключение из этого правила, но я еще не сталкивался с ним) и вместо этого используйте RenderPartial и снабдите модель вызовом.
Таким образом, существует только одна ступень контроллера, которая значительно упрощает обслуживание, и, кроме того, одна ступень контроллера может гарантировать, что любые дорогостоящие операции, такие как взаимодействие с базой данных, будут максимально эффективными, чего нельзя сделать, если обработка распределена по всей несколько этапов контроллера. Используя многократную логику RenderPartial, можно использовать логику представления, чтобы придерживаться принципа DRY, который сохраняет основное преимущество RenderAction, но без двух больших недостатков.
Плохой:
Html.RenderAction("ViewName", "PersonName", new { id = Model.Person.ID });
Хорошо:
Html.RenderPartial("ViewName", Model.Person.Name);
"Исправление ошибок преследует цепочки контроллеров после вызовов html.renderaction".
О Боже. Это звучит ужасно.
Уверен, что это вонючий RenderAction как раз для этих сценариев "продвинутых виджетов".
Это старый вопрос, но он по-прежнему применим к коду сегодня. Время, которое следует использовать, - это частичное представление, которое не относится к текущей информации. Например, если у вас есть навигация, отображаемая на каждой странице, но заполненная моделью. Помещать эту модель в каждую другую модель, когда они не связаны, - плохое умение.
+---------+ +-----+
| | | |
| content | | nav |
| | | |
+---------+ +-----+
Вы можете кэшировать навигацию, если передаете набор ролей в метод RenderAction(), а затем используете Donut Hole Cache.
Я думаю, что разумно стараться не использовать все эти помощники, как встроенные, так и написанные на заказ, как можно чаще. Это как удобный ярлык для быстрого решения задач в дизайне, но то, что вы на самом деле делаете, - это вносит большой беспорядок.