Как установить переменную на странице _Layout?

У меня есть представление, и я хочу использовать страницу макета. На странице макета я хочу иметь условный баннер, который часть просмотра будет включать/выключать. Просто интересно, как я могу это сделать?

У меня есть это на странице _Layout.cshtml...

@if (ShowBanner){

   <h1>banner</h1>

}

Мне интересно, как я могу включить это/выключить с моей страницы просмотра MVC? Или это вообще правильно? Я имею в виду, если я объявлю эту переменную на странице просмотра, конечно, мастер не знает об этом? Как они взаимодействуют через С#? Я использую Viewbag? Скорее нет.

Я знаю с формами все о ссылках на страницу или участника, просто не могу видеть его с MVC...

Любая помощь очень ценится...

Спасибо Пит

Ответ 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>
}

Надеюсь, это поможет!

Ответ 2

Наличие модели для вашего макета - это не очень хорошая идея, так как она заставит все представления использовать эту модель. Однако вы можете поместить этот тип информации в ViewBag и иметь значение, заложенное в конструкторе одной из баз ваших контроллеров.

Ответ 3

Вы можете определить РАЗДЕЛ в своем макете, а затем, если ваш вид отвечает за "заполнение" этого раздела... ваш взгляд может поместить HTML в этот раздел.

Здесь вы можете увидеть подробное пошаговое руководство по использованию SECTIONS:

http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx

Ответ 4

Попробуйте что-то вроде этого:

на вашем контроллере

var yourVariable;
// other stuff and eventually fill the 'yourVariable' variable
ViewBag.YourVariable = yourVariable;

а затем на ваш взгляд

@if (ViewBag.YourVariable){

    <!-- Your markup -->

}