Ядро asp.net передает данные со страницы содержимого на макет

Я пытаюсь установить главную страницу layout.cshtml, которая будет работать последовательно для всех страниц, кроме одной или двух (обычно для входа и выхода). В моем макете я хотел бы отобразить некоторые элементы, которые я не хочу отображать для этих специальных страниц.

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

Я видел предыдущий код, который использует PageData для передачи переменной в макет (который казался очень полезным, поскольку я мог использовать bool на соответствующих страницах и проверять его в макете), но похоже, что он был удален. Есть ли другие способы, которые работают без использования контроллера или обновления каждой страницы для отображения битов, которые я хочу скрыть всего на одной странице?


person gbjbaanb    schedule 27.12.2017    source источник


Ответы (2)


Есть несколько способов добиться этого. Если вы хотите просто «выключить» какую-то часть страницы, возможно, самый простой подход - использовать ViewData. Что-то вроде:

_Layout.cshtml

@if (ViewData["ShowThis"] as bool? ?? true)
{
    <!-- HTML here -->
}

Это приведет к тому, что по умолчанию он будет true (показать HTML), если ключ ViewData не определен, поэтому в ваших представлениях, где вы хотите его отключить, вам просто нужно будет определить его как false:

SomeView.cshtml

@{
    ViewData["ShowThis"] = false;
}

Как вариант, вы можете использовать разделы. Это даст вам возможность при желании заменить HTML чем-нибудь другим.

_Layout.cshtml

@if (!IsSectionDefined("Foo"))
{
    <!-- HTML here -->
}
else
{
    @RenderSection("Foo", required: false)
}

Затем, по вашему мнению, вы просто определяете раздел. Если вы не хотите ничего отображать, вы можете просто определить его как пустое:

SomeView.cshtml

@section Foo {}

Или вы можете вставить что-нибудь, чтобы заменить область:

@section Foo
{
    <!-- alternate HTML here -->
}
person Chris Pratt    schedule 27.12.2017
comment
Спасибо, в данный момент я использую последний метод, и рендеринг пустого раздела немного пахнет. Я пробовал использовать ViewData, но ваш совет по умолчанию, если мне не хватало null. ваше здоровье. - person gbjbaanb; 27.12.2017

Вы можете попробовать это, чтобы передать ViewData на странице _Layout в asp.net mvc

public class DynamicMenuAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
       base.OnActionExecuted(filterContext);
       var result = filterContext.Result as ViewResult;
       result.ViewData["key"] = "Hello Bangladesh";
    }
}

Добавить внедрение зависимостей в файл Startup.cs

services.AddMvc(
    config =>
    {
       config.Filters.Add(new DynamicMenuAttribute());
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

Теперь вы можете ViewData["key"] в _Layout.cshtml

person Aminur Rahman    schedule 03.03.2019