Я работаю над приложением ASP.NET Core, и у меня есть базовый контроллер, который определяет метод установки заголовка заголовка с помощью ViewBag. Я хочу использовать этот метод в своих представлениях Razor для отображения динамических заголовков заголовков.
Вот базовый контроллер с методом SetHeaderTitle:
public abstract class BaseController
{
protected void SetHeaderTitle(string headerName)
{
ViewBag.HeaderTitle = headerName;
}
}
В моем производном контроллере я вызываю этот метод внутри конструктора:
public class MaterialConstantNumbersController : BaseController
{
private const string HeaderName = "Constant numbers section";
public MaterialConstantNumbersController(IMediator mediator) : base(mediator)
{
SetHeaderTitle(headerName: HeaderName);
}
}
Однако при загрузке страницы Razor заголовок заголовка не отображается.
Что может быть причиной того, что ViewBag.HeaderTitle не отображается в представлении Razor?
Каков наилучший подход к установке и отображению разных заголовков для каждого контроллера в моем приложении?
Я использую внедрение зависимостей для IMediator в своих контроллерах.
Представление Razor, в котором я пытаюсь отобразить заголовок заголовка, настроено для доступа ViewBag.HeaderTitle.
Я поместил вызов этого метода во все действия, но этот подход совсем ненадежен и представляет собой повторяющуюся работу.





1. Невозможно вызвать метод SetHeaderTitle в конструкторе контроллера, его необходимо вызывать в каждом действии.
2. Вы используете внедрение зависимостей для IMediator в своих контроллерах. Я думаю, у вас есть некоторые ошибки. Поэтому я написал для вас пример.
Вот пример:
1). Базовыйконтроллер.cs
using MediatR;
using Microsoft.AspNetCore.Mvc;
namespace webApi2.Controllers
{
public abstract class BaseController : Controller
{
private readonly IMediator _mediator;
public BaseController(IMediator mediator) {
_mediator = mediator;
}
protected void SetHeaderTitle(string headerName)
{
ViewBag.HeaderTitle = headerName;
}
}
}
2). ПродуктыController.cs
using MediatR;
using Microsoft.AspNetCore.Mvc;
namespace webApi2.Controllers
{
public class ProductsController : BaseController
{
private readonly IMediator _mediator;
private const string HeaderName = "Constant numbers section";
public ProductsController(IMediator mediator) : base(mediator)
{
_mediator = mediator;
}
public IActionResult Index()
{
SetHeaderTitle(headerName: HeaderName);
return View();
}
}
}
3). index.cshtml
Результат следующий:
Основная причина, по которой этот подход не работает правильно, как вы ожидали, заключается в том, что конструктор запускается перед методом действия и viewBag. задается во время выполнения метода действия. есть 2 шага, которые вы можете принять во внимание:
1- Переместите setHeaderTitle в фильтр действий: вместо установки заголовка заголовка в конструкторе вы можете создать фильтр действий, чтобы установить его. перед выполнением метода действия. Это гарантирует, что сумка просмотра будет правильно настроена перед визуализацией представления.
public class HeaderTitleFilter : ActionFilterAttribute
{
private readonly string _headerTitle;
public HeaderTitleFilter(string headerTitle)
{
_headerTitle = headerTitle;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
var controller = context.Controller as Controller;
if (controller != null)
{
controller.ViewBag.HeaderTitle = _headerTitle;
}
base.OnActionExecuting(context);
}
}
и в контроллере
[HeaderTitleFilter(HeaderName)]
public class MaterialConstantNumbersController{}
2. Переопределите onactionexecuting в базовом контроллере, чтобы установить заголовок заголовка перед выполнением любого метода действия.
public abstract class BaseController : Controller
{
protected virtual string HeaderTitle { get; set; }
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
ViewBag.HeaderTitle = HeaderTitle;
}
}
public class MaterialConstantNumbersController : BaseController
{
private const string HeaderName = "Constant numbers section";
public MaterialConstantNumbersController(IMediator mediator) : base()
{
HeaderTitle = HeaderName;
}
}
Надеюсь, это вам поможет.
Огромное спасибо Али. Мой запрос - это именно то, что вы ответили.
Можете ли вы поделиться полным минимально воспроизводимым примером?