首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从PartialViewResult获得没有.ControllerContext的字符串

从PartialViewResult获得没有.ControllerContext的字符串
EN

Stack Overflow用户
提问于 2016-08-28 21:15:37
回答 1查看 889关注 0票数 0

如何使用来自ControllerContext 的HTML代码来呈现一个PartialViewResult,而不必使用(因为在我的控制器对象.ControllerContext中,nullnull,并且伪造或试图破解它不起作用)。.ControllerContext不是来自Contorller的INSIDE的null,但我需要在Contorller的之外使用)。

代码语言:javascript
复制
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();
    }
}

(更广泛的explaination)------------------------------

我试过:

  1. 制造假货
  2. 尝试从另一个控制器调用它(成功,但我在这个控制器中没有特定的.cshtml )
  3. 试图以各种甚至最愚蠢的方式制作非空ControllerContext。
  4. 只是尝试从这个PartialViewResult (.ToString())中“生成普通字符串”
  5. 甚至复制粘贴代码从一个控制器到第二个控制器。它不能工作,因为我从DependencyRegistrar (IoC)获得了这些控制器对象,然后我可以使用它们,,但是它们总是有空的.ControllerContext.。

我只是有一些PartialViewResultActionResult方法,有100%的有效和工作的HTML代码。我已经对这个主题进行了艰苦的搜索,但我发现的只是使用ControllerContext (顺便说一下)的答案。这段代码至少在20个不同的网页上提到。我在我的项目中也有这个,我不得不说,它工作得很好,但是我有一个PartialViewResult外部控制器)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-04 00:30:35

ActionFilterAttribute使用一个类型为ActionExecutedContext和name filterContext的参数来约束方法OnActionExecuted()。

是的,filterContext已经包含了我丢失的初始化和有效的.ControllerContext。

此属性可以直接指向控制器、操作(只有返回ActionResult的操作),也可以通过继承IFilterProvider及其一个方法GetFiltres间接地实现。

代码语言:javascript
复制
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().As(),您也需要这一行;

效果:在执行GemStoneAction之后,将调用OnActionExecuted。与有效.ControllerContext of GemStoneController.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39195849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档