Я занимаюсь разработкой веб-сайта с использованием инфраструктуры Asp.Net MVC.Нам нужно добавить общую информацию о пользователях на нескольких страницах, аналогично панели репутации в верхней части переполнения стека.
Я считаю важным, чтобы при созданииметод контроллера, чтобы добавить эту дополнительную информацию к представлению.Это исключает возможность передачи этой информации в объект ViewData или внесения поправок в ViewModels для принятия поля репутации, так как каждый контроллер будет выглядеть следующим образом:
public ActionResult Index()
{
ViewData["reputationScore"] = GetUsersReputation(userId);
// main controller logic here
}
Если это используется в 90% случаевстраниц на сайте, это может занять много времени, если мы также хотим отобразить счетчик значков пользователей.
Я могу придумать 4 решения этой
Использование главных страниц Извлеките репутацию пользователя из кода главной страницы и поместите отметку для репутации в разметку главной страницы.
Недостатки:
- Похоже, это отходит от всего, что представляет MVC.
- Я рассчитывал перейти на использование альтернативных движков вида (например, бритвы). Я не уверен, насколько хорошо они будут смешиваться.
- Это имеет тенденцию ограничивать макет репутации - трудно поместить его в середину страницы.
Расширьте HtmlHelper, чтобы добавить метод GetUsersReputation Это, кажется, небольшое нарушение того, для чего должен использоваться объект Html - это не просто рендеринг вывода, но попадание в базу данных.Я не могу думать ни о каких других существенных проблемах с этим, кроме нарушения метафоры.
Переопределение System.Web.Mvc.ViewPage Переопределение Viewpage для предоставления объекта в дополнение кHTML, который можно использовать для вызова выбора методов, которые обращаются к базе данных.Убедитесь, что методы расширения могут быть добавлены так же, как HtmlHelper, так что, когда и когда нужны новые методы, они могут быть расширены соответствующим образом.Это может позволить нам написать что-то вроде:
<% DataAccess.GetUsersReputation() %>
Создать базовую модель общего вида Вместо того, чтобы передавать модель представления прямо в представление, оберните ее в модель базового представления, которая можетхраните все необходимые методы:
public ActionResult Index()
{
MyViewModel viewCoreInfo = model.GetData();
return View(new BaseViewModel<MyViewModel>(viewCoreInfo));
}
BaseViewModel может предоставить все необходимые вам свойства для дополнительной информации, необходимой на веб-странице.например, UsersReputation (он может запросить базу данных в конструкторе или загрузить данные при обращении к свойству).Я думаю, что это лучше поддерживает метафору MVC, но немного громоздко.
- Кто-то еще придумал лучшее решение
- Чтолучше всего - если вы их использовали, были ли они эффективны / проблематичны?