В любое время, когда вам нужно отобразить данные (по любому конкретному объекту или коллекции объектов) в представлении, используйте строго типизированное представление.
Если ваше представление носит исключительно информационный характер, вы можете использовать ModelState для передачи небольших битов информации (например, страниц об успехе / ошибке, неавторизованных сообщениях и т. Д.)
В моих приложениях у КАЖДОГО представления строго типизированный вид, так что я могу легко передавать информацию о входе пользователя на главную страницу. То есть все мои представления строго типизированы, шаблонизированы и ограничены базовым классом, который содержит конфигурацию сайта и информацию для входа пользователя.
Из-за этого я могу сделать это:
public class MyBaseMasterPage : ViewMasterPage<MyBaseModel>
{
public string CurrentTheme
{
get
{
if (this.Model.CurrentUser != null)
return this.Model.CurrentUser.Theme;
else return this.Model.Config.DefaultTheme;
}
}
public User CurrentUser { get { return this.Model.CurrentUser; } }
public ConfigurationRepository Config { get { return this.Model.Config; } }
}
Обратите внимание, что, поскольку главная страница имеет тематическую структуру, основанную ТОЛЬКО на том, что заполнено в модели, само представление никогда не вызовет попадание в базу данных / кэш.
MyBaseModel настроен так:
public class MyBaseModel
{
private MyBaseModel() { }
public MyBaseModel(MyBaseController controller)
{
this.CurrentUser = controller.CurrentUser;
this.Config = controller.Config;
}
public User CurrentUser { get; private set; }
public ConfigurationRepository Config { get; private set; }
}
Закрытый конструктор заставляет все подклассы моей модели инициализировать модель с помощью контроллера soruce.
Базовый класс контроллера выводит пользователя из сеанса, а Config из кэша.
Таким образом, несмотря ни на что, все мои представления имеют доступ к пользовательским данным и данным конфигурации, даже не создавая попадания в БД.
Теперь в MyBaseController:
public class LanLordzBaseController : Controller
{
[Obsolete]
protected new ViewResult View(string viewName, object model)
{
if (model == null)
{
throw new ArgumentNullException("model");
}
if (!(model is MyBaseModel))
{
throw new ArgumentException("The model you passed is not a valid model.", "model");
}
return base.View(viewName, model);
}
protected ViewResult View(string viewName, MyBaseModelmodel)
{
if (model == null)
{
throw new ArgumentNullException("model");
}
return base.View(viewName, (object)model);
}
public ConfigurationRepository Config { get { ... } }
public User CurrentUser { get { ... } }
}
Это помогло мне найти все мои контроллеры, которые возвращали представления, которые не были унаследованы от надлежащего базового класса.