介绍
我正在尝试Action - ViewResult
使用扩展方法进行装饰。目标是能够ViewData
在 Decorator 的使用范围内,在Controller
. 但是,我只能在TempData
我想访问ViewData
method 内部时访问ExecuteResultAsync
。
问题
如何在访问 ActionContext 的过程中从 ExecuteResultAsync 访问 ViewData?这完全可能是以下情况吗?
设想
因此,不要编写以下内容:
public async Task<IActionResult> ChangePassword()
{
ViewData["Title"] = "Change Password";
return PartialView("_ChangePasswordPartial",...);
}
我试图让它像这样工作:
public async Task<IActionResult> ChangePassword()
{
return PartialView("_ChangePasswordPartial",...).WithTitle("Change Password");
}
扩展方法:
public static IActionResult WithTitle(this IActionResult action, string modalTitle)
{
return new ModalTitleDecorator(action,modalTitle);
}
装饰师:
public class ModalTitleDecorator : ActionResult
{
private readonly IActionResult _actionResult;
private readonly string _modalTitle;
public ModalTitleDecorator(IActionResult action, string modalTitle)
{
_actionResult = action;
_modalTitle = modalTitle;
}
public override async Task ExecuteResultAsync(ActionContext context)
{
var tempData = context.HttpContext.RequestServices.GetService<ITempDataDictionaryFactory>()
.GetTempData(context.HttpContext);
//always null...I assume that ViewData is not available according to HttpContext.
//TempData is available probably according to passing into next request.
var viewData = context.HttpContext.RequestServices.GetService<ViewDataDictionary>();
//something like this would be great
ViewData["Title"] = _modalTitle;
await _actionResult.ExecuteResultAsync(context);
}
}