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

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

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

<code>@if (ShowBanner){

   <h1>banner</h1>

}
</code>

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

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

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

Спасибо Пит

Ответы на вопрос(4)

Решение Вопроса

ViewBag тоже. Помимо глупого имени, мне не нравится слабая типизация, которая сопровождает его. Решение есть, но оно как-то связано, так что терпите меня.

Сначала создайте класс для хранения & quot; отображать подсказки & quot; которые должны быть переданы в макет. Я творчески называю этот класс "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, Однако я не знаю, как избежать храненияsomething вViewData/ViewBag; это просто сводит к минимуму число слабо типизированных переменных до одной. После того, как вы это сделали, вы можете хранить как можно больше строго напечатанной информации вDisplayHints как ты хочешь.

Теперь, когда у вас есть базовый класс для ваших представлений, вWeb.configнам нужно указать MVC использовать ваш пользовательский базовый класс:

<pages pageBaseType="MyNamespace.Views.MyViewPage">

Это звучит как большая проблема, но вы получаете серьезную функциональность для всей этой работы. Теперь, на ваш взгляд, вы можете установить любую подсказку для отображения следующим образом:

@{ DisplayHints.ShowBanner = true; }

И в вашем макете вы можете получить к нему доступ так же легко:

@if( DisplayHints.ShowBanner ) {
  <div>My banner....</div>
}

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

 11 апр. 2012 г., 16:45
Мне нравится это решение ... и я не думаю, что оно "намного больше проблем" продлитьWebViewPage
 11 апр. 2012 г., 14:57
Интересно, что ViewData по-прежнему имеет те же слабые проблемы с типизацией, что и ViewBag, и у вас возникло гораздо больше проблем, чтобы туда добраться.
 11 апр. 2012 г., 19:33
Мэйс, да,ViewData имеет те же слабые проблемы с печатаниемViewBag, Однако вместо сохранения набора отображаемых подсказок в виде слабо типизированных переменных вы сохраняете только один объект, в который вы можете поместить столько строго типизированных вещей, сколько захотите, включая более сложные структуры. В моем приложении этоDisplayHints класс содержит свыше двадцати членов ... все строго типизированы.

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

 18 мар. 2014 г., 17:41
Представления не имеют прямого доступа к контроллеру.
 10 апр. 2012 г., 21:33
Конечно, я не был уверен, что ОП всегда собирался использовать одну и ту же базу контроллеров.
 18 мар. 2014 г., 17:10
если вы можете поместить переменную в пакет просмотра, почему вы не можете строго указать ее в самом контроллере?
 10 апр. 2012 г., 21:12
Вы даже можете иметь базовый контроллер, который всегда помещает переменную в ViewBag

а затем, если ваш вид отвечает за & quot; заполнение & quot; этот раздел ... ваш взгляд может разместить HTML в этом разделе.

Здесь вы можете увидеть подробное пошаговое руководство по использованию РАЗДЕЛОВ:

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

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

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

тогда на ваш взгляд

@if (ViewBag.YourVariable){

    <!-- Your markup -->

}

Ваш ответ на вопрос