从PartialViewResult获取字符串WITHOUT .ControllerContext

时间:2016-08-28 21:15:37

标签: c# asp.net asp.net-mvc asp.net-core

如何使用string 的HTML代码呈现PartialViewResult,而无需使用ControllerContext (因为在我的控制器对象.ControllerContext是null,制作假货或试图破解它不起作用.ControllerContext不是来自 INSIDE null > Contorller,但我需要使用此Contorller的 OUTSIDE

public string RenderRazorViewToString(string viewName, object model) {
    ViewData.Model = model;
    using (var sw = new StringWriter()) {
        var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
        var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
        viewResult.View.Render(viewContext, sw);
        viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
        return sw.GetStringBuilder().ToString();
    }
}

(更广泛的解释)------------------------------------------- -------------------------------------

我试过了:

  1. 制作假货
  2. 试图从花药控制器中调用它(成功,但我在此控制器中没有特定的.cshtml)
  3. 尝试以各种甚至是最愚蠢的方式制作非null的ControllerContext
  4. 只是尝试制作简单的字符串"来自此PartialViewResult(.ToString())
  5. 甚至将代码从1个控制器复制粘贴到第2个控制器。它不会工作,因为我从DependencyRegistrar(IoC)获得了这些控制器对象,然后我的ofc可以使用它们,但它们总是具有null .ControllerContext。
  6. 我只是来自某些PartialViewResult方法的ActionResult,其中包含100%有效且有效的HTML代码。 我已经对这个主题进行了很难的搜索,但我找到的只是使用ControllerContext的答案(顺便说一句。这篇文章 在至少20个不同的网站上提到了代码。在我的项目中我也有这个,我不得不说,它 效果很好,但我有一个PartialViewResult外部控制器。)

1 个答案:

答案 0 :(得分:0)

Class ActionFilterAttribute 使用一个类型为 ActionExecutedContext 的参数和名称filterContext来构造OnActionExecuted()方法。

是的, filterContext已经包含我缺少的初始化和有效的.ControllerContext。

这个属性可以直接到达控制器,动作(只有那些返回ActionResult)或间接通过继承IFilterProvider及其一个方法GetFiltres

public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
    if ((actionDescriptor.ControllerDescriptor.ControllerType == typeof(GemStoneProject.GemStoneController)) &&
        (actionDescriptor.ActionName.Equals("GemStoneAction")) && controllerContext.HttpContext.Request.HttpMethod == "POST")
    {
        return new List<Filter>() { new Filter(this, FilterScope.Action, 0) };
    }

    return new List<Filter>() { };
}


    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
    /*your code, that replaces previous View to new View. 
You have available and valid .ControllerContext inside "filterContext" argument*/
    }

如果你愿意,你还需要这一行 。builder.RegisterType()为();

效果:执行GemStoneAction后,将调用OnActionExecuted。 使用GemStoneController的有效.ControllerContext。