gpt4 book ai didi

c# - ASP.NET MVC - 在 OnActionExecuted 中修改 View 结果

转载 作者:行者123 更新时间:2023-11-30 23:21:11 27 4
gpt4 key购买 nike

我有一个 ASP.NET MVC Controller ,其中包含一组返回 ViewResult 的操作方法。现在,我需要能够通过以下方式更改基于特定 URL 参数的操作结果:

  • 如果参数不存在,直接返回ViewResult
  • 如果参数存在,从刚刚执行的操作中获取ViewResult,将 View 渲染成一个字符串,并返回包含这个字符串的FileStreamResult(原始HTML ) + 一些附加信息(与问题无关)

我试图通过覆盖 Controller 中的 OnActionExecuted 来做到这一点:

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
var viewResult = filterContext.Result as ViewResult;
if (viewResult != null /* && certain URL param present*/)
{
string rawHtml = RenderViewIntoString(viewResult);
filterContext.Result = new FileStreamResult(new MemoryStream(Encoding.UTF8.GetBytes(rawHtml)), "application/octet-stream");
}
}

但是我找不到实现RenderViewIntoString的方法,因为由于某种原因viewResult.View在这里是null

如何在此处将 View 渲染为字符串?

最佳答案

viewResult.View 仅当 View 结果在 Controller 的上下文中执行时才会被填充(参见 MVC source code 中的 ExecuteResult 方法)。方法 OnActionExecuted 在管道中较早调用,这就是为什么 viewResult.View 在您的情况下为 null

您需要做的是使用 ViewEngineCollection 手动找到 View ,然后渲染它:

private static string RenderViewIntoString(ViewResult viewResult, ActionExecutedContext filterContext)
{
string viewName = !string.IsNullOrEmpty(viewResult.ViewName) ? viewResult.ViewName : filterContext.ActionDescriptor.ActionName;

IView view = viewResult.ViewEngineCollection.FindView(filterContext.Controller.ControllerContext, viewName, viewResult.MasterName).View;

if (view == null)
{
throw new InvalidOperationException($"The view '{viewName}' or its master was not found");
}

using (var stringWriter = new StringWriter())
{
var viewContext = new ViewContext(filterContext.Controller.ControllerContext, view, filterContext.Controller.ViewData, filterContext.Controller.TempData, stringWriter);
view.Render(viewContext, stringWriter);
return stringWriter.ToString();
}
}

关于c# - ASP.NET MVC - 在 OnActionExecuted 中修改 View 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39332370/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com