C# 如何在ExecuteSultAsync中访问ViewDataDictionary? 简介
我试图在扩展方法的使用中装饰C# 如何在ExecuteSultAsync中访问ViewDataDictionary? 简介,c#,asp.net-core,asp.net-core-mvc,asp.net-core-2.0,C#,Asp.net Core,Asp.net Core Mvc,Asp.net Core 2.0,我试图在扩展方法的使用中装饰Action-ViewResult。目标是能够在Decorator的使用范围内,在控制器之外设置视图数据。但是,我只能访问TempData,而我想访问ViewData方法executesultasync的内部 问题 如何在访问ActionContext的过程中从ExecuteSultAsync访问ViewData?这是下面的吗 有可能吗 脚本 所以不要写以下内容: 装饰师: public async Task<IActionResult> ChangeP
Action-ViewResult
。目标是能够在Decorator的使用范围内,在控制器
之外设置视图数据
。但是,我只能访问TempData
,而我想访问ViewData
方法executesultasync
的内部
问题
如何在访问ActionContext的过程中从ExecuteSultAsync访问ViewData?这是下面的吗
有可能吗
脚本
所以不要写以下内容:
装饰师:
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);
}
}
公共类ModalTitleDecorator:ActionResult
{
私有只读IActionResult\u actionResult;
私有只读字符串_modaltle;
公共ModalTitleDecorator(IActionResult操作,字符串modalTitle)
{
_行动结果=行动;
_modalTitle=modalTitle;
}
公共重写异步任务ExecuteSultAsync(ActionContext上下文)
{
var tempData=context.HttpContext.RequestServices.GetService()
.GetTempData(context.HttpContext);
//始终为空…我假设ViewData根据HttpContext不可用。
//TempData可能根据传递到下一个请求而可用。
var viewData=context.HttpContext.RequestServices.GetService();
//像这样的东西太好了
ViewData[“标题”]=\u MODALITLE;
wait_actionResult.executeSultAsync(上下文);
}
}
对于视图数据
,您无法通过context.HttpContext.RequestServices.GetService
解析它
/// <summary>
/// Gets or sets <see cref="ViewDataDictionary"/> used by <see cref="ViewResult"/> and <see cref="ViewBag"/>.
/// </summary>
/// <remarks>
/// By default, this property is intiailized when <see cref="Controllers.IControllerActivator"/> activates
/// controllers.
/// <para>
/// This property can be accessed after the controller has been activated, for example, in a controller action
/// or by overriding <see cref="OnActionExecuting(ActionExecutingContext)"/>.
/// </para>
/// <para>
/// This property can be also accessed from within a unit test where it is initialized with
/// <see cref="EmptyModelMetadataProvider"/>.
/// </para>
/// </remarks>
[ViewDataDictionary]
public ViewDataDictionary ViewData
很好,很好用。然而,反射的表现是什么?开销是不是很小,我不必处理?
/// <summary>
/// Gets or sets <see cref="ViewDataDictionary"/> used by <see cref="ViewResult"/> and <see cref="ViewBag"/>.
/// </summary>
/// <remarks>
/// By default, this property is intiailized when <see cref="Controllers.IControllerActivator"/> activates
/// controllers.
/// <para>
/// This property can be accessed after the controller has been activated, for example, in a controller action
/// or by overriding <see cref="OnActionExecuting(ActionExecutingContext)"/>.
/// </para>
/// <para>
/// This property can be also accessed from within a unit test where it is initialized with
/// <see cref="EmptyModelMetadataProvider"/>.
/// </para>
/// </remarks>
[ViewDataDictionary]
public ViewDataDictionary ViewData
public static class ActionResultExtension
{
public static IActionResult WithTitle(this IActionResult action, string modalTitle)
{
return new ModalTitleDecorator(action, modalTitle);
}
}
public class ModalTitleDecorator : PartialViewResult
{
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)
{
ViewDataDictionary viewData = _actionResult
.GetType()
.GetProperty("ViewData")
.GetValue(_actionResult) as ViewDataDictionary;
if (viewData != null)
{
viewData["Title"] = _modalTitle;
}
await _actionResult.ExecuteResultAsync(context);
}
}