如何将形状渲染为字符串? [英] How to render shape to string?

查看:117
本文介绍了如何将形状渲染为字符串?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Orchard 1.6,并希望使用主题自定义布局等将视图呈现为字符串.

i am using Orchard 1.6 and want to render view to string with theme custom layout and so on.

实际上,有果园cms渲染形状作为电子邮件模板,但我需要更多详细信息(无法在该答案中添加注释,我没有足够的代表(:,并且无法发送私人消息)

In fact there is orchard cms rendering shape as email template but i need some more details (cant add comment to that answer, i dont have rep enough :(, and cant send private message)

我在控制器中进行测试(以后我想在单独的任务中进行int操作).控制器就是(模型是具有某些属性的简单类)

I do it in controller for test (in future i want to do int in separate task). So controller is (model is simple class with some properties)

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类.

ViewRendererHttpContext just derived from HttpContextBase and very simple (can post its code), DummyController is empty class derived from Controller, ShapeView is epmty class derived from IView.

我的模块中有View/MyTestShape.cshtml.

Ofc i have View/MyTestShape.cshtml in my module.

问题是深度执行var data = display(shape).ToHtmlString();var result = htmlHelper.Partial(harvestShapeInfo.TemplateVirtualPath, displayContext.Value);(类"ShapeTemplateBindingStrategy", 方法专用IHtmlString Render(......)") 我有异常该方法或操作未实现."

Problem is when executing var data = display(shape).ToHtmlString(); in depth var result = htmlHelper.Partial(harvestShapeInfo.TemplateVirtualPath, displayContext.Value); (class "ShapeTemplateBindingStrategy", method "private IHtmlString Render(......)") I have exception "The method or operation is not implemented."

我应该实现哪种方法以及在什么类中实现?

What method and in what class i should implement?

感谢您的提示.我的英语很差,对此感到抱歉.

Thanks for any tips. My english is very bad so sorry for it.

推荐答案

它也不适合我,我正在使用Orchard 1.6.曾经有投票支持它,但是我不确定它是否在Orchard 1.7中被采用.

It does not work with me either, I am using Orchard 1.6. There used to be a vote to make it work but I am not sure it is taken in Orchard 1.7.

这是我在项目中执行此操作的方法(我将形状渲染为ajax DataTables的字符串),只要您从控制器进行调用即可.

Here is my way to do it in my project (I render shapes to string for ajax DataTables), provided that you make the call from a controller.

在您的服务(或控制器)内部,获得2个服务:IThemeAwareViewEngine和IDisplayHelperFactory:

Inside your service (or controller), get your hand to 2 services: IThemeAwareViewEngine and IDisplayHelperFactory:

    private readonly IThemeAwareViewEngine _themeAwareViewEngine;
    private readonly IDisplayHelperFactory _displayHelperFactory;
    public AjaxDataTables(
        IThemeAwareViewEngine themeAwareViewEngine,
        IDisplayHelperFactory displayHelperFactory
        )
    {
        _themeAwareViewEngine = themeAwareViewEngine;
        _displayHelperFactory = displayHelperFactory;
    }

如果您有对真实控制器的引用,这里是获取魔术显示的方法:

Here is the way to get the magic display, provided that you have a reference to a real 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; }
    }

并将形状渲染为字符串:

And render shape to string:

var display = GetDisplayHelper(controller);
var str = Convert.ToString(display(shape.Content));

同样,仅当您通过控制器操作进行调用时,此功能才起作用.

Again, this work only if you make call from a controller action.

HTH, 休伊

这篇关于如何将形状渲染为字符串?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆