Ответ 1
Я объясню аналогичное решение, которое очень хорошо работает для меня. С небольшими изменениями, я считаю, что это сработает для вас (и других, надеюсь).
В принципе, мы будем использовать наследование.
Контроллеры
Создайте настраиваемый базовый контроллер, например
public class BaseController : Controller
и изменим наши контроллеры на наследование от него, как
public class HomeController : BaseController
Модели (ViewModels, я говорю)
Вероятно, у вас много классов в папке "Модели", верно? Они действуют как DTOs от контроллера к представлениям, right²? Если вы ответили "да" для обоих, продолжайте читать.
Позвольте создать базовый класс модели, например public class BaseVM
, и пусть наши модели наследуют от него, например public class HomeIndex : BaseVM
Важно: ваш файл макета (_Layout
или вообще любой) должен быть строго типизирован для BaseVM
или его дочернего элемента.
Крючок
Теперь, когда все красиво напечатано, позвольте использовать конвейер запроса в нашу пользу.
В BaseController
вы добавите метод, который выглядит следующим образом:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Result is ViewResultBase)//Gets ViewResult and PartialViewResult
{
object viewModel = ((ViewResultBase)filterContext.Result).Model;
if (viewModel != null && viewModel is BaseVM)
{
BaseVM baseVM = viewModel as BaseVM;
baseVM.MyIdentity = (MyIdentity)((GenericPrincipal)context.User).Identity;
//and so on...
}
}
base.OnActionExecuted(filterContext);//this is important!
}
OnActionExecuted
называется после выполнением действия, но до рендеринга представления. Это именно то, что мы хотим.
Надеюсь, ты это уже понял. =)