Как сделать фигуру строкой?

я использую Orchard 1.6 и хочу отобразить представление в строку с пользовательским макетом темы и так далее.

На самом деле существует orchard cms, отображающий форму в виде электронной почты. шаблон, но мне нужно больше деталей (не могу добавить комментарий к этому ответу, у меня недостаточно представителей :(, и я не могу отправить личное сообщение)

Я делаю это в контроллере для теста (в будущем я хочу сделать int в отдельной задаче). Итак, контроллер (модель представляет собой простой класс с некоторыми свойствами)

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.

У меня есть View/MyTestShape.cshtml в моем модуле.

Проблема заключается в том, что при выполнении var data = display(shape).ToHtmlString(); в глубину var result = htmlHelper.Partial(harvestShapeInfo.TemplateVirtualPath, displayContext.Value); (класс «ShapeTemplateBindingStrategy», метод «private IHtmlString Render (.....)») у меня есть исключение «Метод или операция не реализованы».

Какой метод и в каком классе я должен реализовать?

Спасибо за любые советы. Мой английский очень плохой, так что извините за это.


person user2449425    schedule 05.06.2013    source источник


Ответы (1)


У меня тоже не работает, пользуюсь Orchard 1.6. Раньше было голосование, чтобы заставить его работать, но я не уверен, что оно проводится в Orchard 1.7.

Вот мой способ сделать это в моем проекте (я отображаю фигуры в строку для ajax DataTables), при условии, что вы делаете вызов из контроллера.

Внутри вашего сервиса (или контроллера) получите доступ к 2 сервисам: IThemeAwareViewEngine и IDisplayHelperFactory:

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

Вот как получить волшебный дисплей, если у вас есть ссылка на реальный контроллер:

    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));

Опять же, это работает, только если вы делаете вызов из действия контроллера.

HTH, Хай

person Huy Do    schedule 09.08.2013