我正在使用 Orchard 1.6,想要使用主题自定义布局等将 View 渲染为字符串。
事实上有orchard cms rendering shape as email template但我需要更多详细信息(无法在该答案中添加评论,我没有足够的代表:(,并且无法发送私有(private)消息)
我在 Controller 中进行测试(将来我想在单独的任务中进行 int 操作)。所以 Controller 是(模型是具有一些属性的简单类)
var renderer = new ViewRenderer(
_workContextAccessor,
_siteThemeService,
_services);
var shape = ShapeFactory.MyTestShape(Model: model);
var result = renderer.RenderMessage(shape);
渲染器是
public string RenderMessage(dynamic shape)
{
var httpContext = new ViewRendererHttpContext(new Uri("http://localhost/orchard/"));
var routeData = new RouteData();
routeData.DataTokens.Add("IWorkContextAccessor", _workContextAccessor);
routeData.Values["controller"] = "Dummy";
var requestContext = new RequestContext(httpContext, routeData);
var controllerContext = new ControllerContext(requestContext, new DummyController());
var viewContext = new ViewContext(controllerContext, new ShapeView(shape), new ViewDataDictionary(shape.Model), new TempDataDictionary(), new StringWriter());
var scope = _workContextAccessor.CreateWorkContextScope(viewContext.HttpContext);
scope.WorkContext.CurrentTheme = _siteThemeService.GetSiteTheme();
var page = new ViewRendererWebViewPage(viewContext, new ViewDataDictionary<dynamic>(shape.Model));
var displayHelperFactory = _services.WorkContext.Resolve<IDisplayHelperFactory>();
var display = displayHelperFactory.CreateHelper(page.ViewContext, page);
var data = display(shape).ToHtmlString();
scope.Dispose();
return data;
}
ViewRendererHttpContext只是从HttpContextBase派生,非常简单(可以发布其代码),DummyController是从Controller派生的空类,ShapeView是从IView派生的epmty类。
Ofc 我的模块中有 View/MyTestShape.cshtml。
问题出在深度执行var data = display(shape).ToHtmlString();
时
var result = htmlHelper.Partial(harvestShapeInfo.TemplateVirtualPath, displayContext.Value);
(类“ShapeTemplateBindingStrategy”,
方法“私有(private) IHtmlString 渲染(......)”)
我有异常“该方法或操作未实现。”
我应该在哪个类中实现什么方法?
感谢您的任何提示。我的英语很糟糕,所以很抱歉。
最佳答案
它也不适合我,我使用的是 Orchard 1.6。曾经有过投票让它发挥作用,但我不确定 Orchard 1.7 中是否进行了投票。
这是我在项目中执行此操作的方法(我将形状渲染为 ajax DataTables 的字符串),前提是您从 Controller 进行调用。
在您的服务(或 Controller )内,获取 2 个服务:IThemeAwareViewEngine 和 IDisplayHelperFactory:
private readonly IThemeAwareViewEngine _themeAwareViewEngine;
private readonly IDisplayHelperFactory _displayHelperFactory;
public AjaxDataTables(
IThemeAwareViewEngine themeAwareViewEngine,
IDisplayHelperFactory displayHelperFactory
)
{
_themeAwareViewEngine = themeAwareViewEngine;
_displayHelperFactory = displayHelperFactory;
}
以下是获得魔法显示的方法,前提是您有对真实 Controller 的引用:
dynamic GetDisplayHelper(Controller controller)
{
// We can specify any view name, just to get a View only, the shape template finding will be taken care by DisplayHelperFactory.
// Here the "Brandking" view is always existed, we can also use something like "Layout" ...
var viewResult = _themeAwareViewEngine.FindPartialView(controller.ControllerContext, "Branding", false, false);
var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, new StringWriter());
return _displayHelperFactory.CreateHelper(viewContext, new ViewDataContainer());
}
private class ViewDataContainer : IViewDataContainer
{
public ViewDataDictionary ViewData { get; set; }
}
并将形状渲染为字符串:
var display = GetDisplayHelper(controller);
var str = Convert.ToString(display(shape.Content));
同样,只有当您从 Controller 操作进行调用时,此功能才有效。
HTH, 休伊
关于orchardcms-1.6 - 如何将形状渲染为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16951605/