Ответ 1
Я с тобой, Exitos: я тоже не использую ViewBag
. Помимо глупого имени, мне не нравится слабый набор текста, который приходит вместе с ним. Есть решение, но это как-то связано, так что несите меня.
Сначала создайте класс для хранения "подсказок отображения", которые должны быть переданы в макет. Я творчески называю этот класс "DisplayHints":
public class DisplayHints {
// anything that you want passed from a view to the layout goes here
public bool ShowBanner { get; set; }
}
Затем создайте класс, полученный из WebViewPage<T>
, который станет новым базовым классом ваших представлений. Обратите внимание, что у нас есть свойство DisplayHints
, которое хранится в ViewData
(доступно для контроллера, вида и макета):
public abstract class MyViewPage<T> : WebViewPage<T> {
public DisplayHints DisplayHints {
get {
if( !ViewData.ContainsKey("DisplayHints") )
ViewData["DisplayHints"] = new DisplayHints();
return (DisplayHints)ViewData["DisplayHints"];
}
}
}
Как отметил комментатор ниже, ViewData
слабо типизирован, как и ViewBag
. Однако я не знаю, как избежать хранения чего-либо в ViewData
/ViewBag
; это просто сводит к минимуму количество слабо типизированных переменных. Как только вы это сделаете, вы можете хранить как можно более строго типизированную информацию в DisplayHints
.
Теперь, когда у вас есть базовый класс для ваших представлений, в Web.config
нам нужно указать MVC использовать ваш собственный базовый класс:
<pages pageBaseType="MyNamespace.Views.MyViewPage">
Звучит много неприятностей, но вы получаете некоторые серьезные функции для всей этой работы. Теперь, на ваш взгляд, вы можете установить любую подсказку дисплея, которую вы хотите, следующим образом:
@{ DisplayHints.ShowBanner = true; }
И в вашем макете вы можете получить к нему доступ так же легко:
@if( DisplayHints.ShowBanner ) {
<div>My banner....</div>
}
Надеюсь, это поможет!