2013-06-05 4 views
2

Я использую Orchard 1.6 и хочу визуализировать вид строки с пользовательским макетом темы и так далее.Как визуализировать фигуру в строку?

На самом деле существует orchard cms rendering shape as email template, но мне нужно еще некоторые детали (не могу добавить комментарий к этому ответу, я не имею репутацию достаточно :(, и не могу отправить личное сообщение)

Я делаю это в контроллер для тестирования (в будущее я хочу сделать 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 - это класс epmty, полученный из IView.

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

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

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

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

ответ

2

Это тоже не работает со мной, я использую 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, Huy

Смежные вопросы