如何使用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();
}
}
(更广泛的解释)------------------------------------------- -------------------------------------
我试过了:
PartialViewResult
(.ToString())我只是来自某些PartialViewResult
方法的ActionResult
,其中包含100%有效且有效的HTML代码。
我已经对这个主题进行了很难的搜索,但我找到的只是使用ControllerContext的答案(顺便说一句。这篇文章
在至少20个不同的网站上提到了代码。在我的项目中我也有这个,我不得不说,它
效果很好,但我有一个PartialViewResult
外部控制器。)
答案 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。