public object ShapeExecute(object shape) { if (shape == null) { return new HtmlString(string.Empty); } var context = new DisplayContext { Display = this, Value = shape, ViewContext = ViewContext, ViewDataContainer = ViewDataContainer }; return _displayManager.Execute(context); }
static IHtmlString Process(ShapeBinding shapeBinding, IShape shape, DisplayContext context) { if (shapeBinding == null || shapeBinding.Binding == null) { // todo: create result from all child shapes return(shape.Metadata.ChildContent ?? new HtmlString("")); } return(CoerceHtmlString(shapeBinding.Binding(context))); }
public object ShapeExecute(object shape) { if (shape == null) { return(new HtmlString(string.Empty)); } var context = new DisplayContext { Display = this, Value = shape, ViewContext = ViewContext, ViewDataContainer = ViewDataContainer }; return(_displayManager.Execute(context)); }
public void BindingProvidedByStrategyInvokesMethod() { var initializers = GetAlterationBuilders(_container.Resolve<IShapeTableProvider>()); var shapeDescriptor = initializers.Where(i => i.ShapeType == "Simple") .Aggregate(new ShapeDescriptor { ShapeType = "Simple" }, (d, i) => { i.Alter(d); return d; }); var displayContext = new DisplayContext(); var result = shapeDescriptor.Binding(displayContext); var result2 = shapeDescriptor.Binding.Invoke(displayContext); Assert.That(result.ToString(), Is.StringContaining("Simple")); Assert.That(result2.ToString(), Is.StringContaining("Simple")); }
public IHtmlString Execute(DisplayContext context) { var shape = _convertAsShapeCallsite.Target(_convertAsShapeCallsite, context.Value); // non-shape arguments are returned as a no-op if (shape == null) { return(CoerceHtmlString(context.Value)); } var shapeMetadata = shape.Metadata; // can't really cope with a shape that has no type information if (shapeMetadata == null || string.IsNullOrEmpty(shapeMetadata.Type)) { return(CoerceHtmlString(context.Value)); } var workContext = _workContextAccessor.GetContext(); var shapeTable = _httpContextAccessor.Current() != null ? _shapeTableLocator.Value.Lookup(workContext.CurrentTheme.Id) : _shapeTableLocator.Value.Lookup(null); var displayingContext = new ShapeDisplayingContext { Shape = shape, ShapeMetadata = shapeMetadata }; _shapeDisplayEvents.Invoke(sde => sde.Displaying(displayingContext), Logger); // find base shape association using only the fundamental shape type. // alternates that may already be registered do not affect the "displaying" event calls ShapeBinding shapeBinding; if (TryGetDescriptorBinding(shapeMetadata.Type, Enumerable.Empty <string>(), shapeTable, out shapeBinding)) { shapeBinding.ShapeDescriptor.Displaying.Invoke(action => action(displayingContext), Logger); // copy all binding sources (all templates for this shape) in order to use them as Localization scopes shapeMetadata.BindingSources = shapeBinding.ShapeDescriptor.BindingSources.Where(x => x != null).ToList(); if (!shapeMetadata.BindingSources.Any()) { shapeMetadata.BindingSources.Add(shapeBinding.ShapeDescriptor.BindingSource); } } // invoking ShapeMetadata displaying events shapeMetadata.Displaying.Invoke(action => action(displayingContext), Logger); // use pre-fectched content if available (e.g. coming from specific cache implmentation) if (displayingContext.ChildContent != null) { shape.Metadata.ChildContent = displayingContext.ChildContent; } else { // now find the actual binding to render, taking alternates into account ShapeBinding actualBinding; if (TryGetDescriptorBinding(shapeMetadata.Type, shapeMetadata.Alternates, shapeTable, out actualBinding)) { shape.Metadata.ChildContent = Process(actualBinding, shape, context); } else { throw new CoeveryException(T("Shape type {0} not found", shapeMetadata.Type)); } } foreach (var frameType in shape.Metadata.Wrappers) { ShapeBinding frameBinding; if (TryGetDescriptorBinding(frameType, Enumerable.Empty <string>(), shapeTable, out frameBinding)) { shape.Metadata.ChildContent = Process(frameBinding, shape, context); } } var displayedContext = new ShapeDisplayedContext { Shape = shape, ShapeMetadata = shape.Metadata, ChildContent = shape.Metadata.ChildContent, }; _shapeDisplayEvents.Invoke(sde => { var prior = displayedContext.ChildContent = displayedContext.ShapeMetadata.ChildContent; sde.Displayed(displayedContext); // update the child content if the context variable has been reassigned if (prior != displayedContext.ChildContent) { displayedContext.ShapeMetadata.ChildContent = displayedContext.ChildContent; } }, Logger); if (shapeBinding != null) { shapeBinding.ShapeDescriptor.Displayed.Invoke(action => { var prior = displayedContext.ChildContent = displayedContext.ShapeMetadata.ChildContent; action(displayedContext); // update the child content if the context variable has been reassigned if (prior != displayedContext.ChildContent) { displayedContext.ShapeMetadata.ChildContent = displayedContext.ChildContent; } }, Logger); } // invoking ShapeMetadata displayed events shapeMetadata.Displayed.Invoke(action => action(displayedContext), Logger); return(shape.Metadata.ChildContent); }
private object BindParameter(DisplayContext displayContext, ParameterInfo parameter, TextWriter output) { if (parameter.Name == "Shape") return displayContext.Value; if (parameter.Name == "Display") return displayContext.Display; if (parameter.Name == "Output" && parameter.ParameterType == typeof(TextWriter)) return output; if (parameter.Name == "Output" && parameter.ParameterType == typeof(Action<object>)) return new Action<object>(output.Write); // meh-- if (parameter.Name == "Html") { return new HtmlHelper( displayContext.ViewContext, displayContext.ViewDataContainer, _routeCollection); } if (parameter.Name == "Url" && parameter.ParameterType.IsAssignableFrom(typeof(UrlHelper))) { return new UrlHelper(displayContext.ViewContext.RequestContext, _routeCollection); } var getter = _getters.GetOrAdd(parameter.Name, n => CallSite<Func<CallSite, object, dynamic>>.Create( Microsoft.CSharp.RuntimeBinder.Binder.GetMember( CSharpBinderFlags.None, n, null, new[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) }))); var result = getter.Target(getter, displayContext.Value); if (result == null) return null; var converter = _converters.GetOrAdd(parameter.ParameterType, CompileConverter); var argument = converter.Invoke(result); return argument; }
private IHtmlString PerformInvoke(DisplayContext displayContext, MethodInfo methodInfo, object serviceInstance) { var output = new HtmlStringWriter(); var arguments = methodInfo.GetParameters() .Select(parameter => BindParameter(displayContext, parameter, output)); var returnValue = methodInfo.Invoke(serviceInstance, arguments.ToArray()); if (methodInfo.ReturnType != typeof(void)) { output.Write(CoerceHtmlString(returnValue)); } return output; }
private IHtmlString RenderRazorViewToString(string path, DisplayContext context) { using (var sw = new StringWriter()) { var controllerContext = CreateControllerContext(); var viewResult = _viewEngine.Value.FindPartialView(controllerContext, path, false); context.ViewContext.ViewData = new ViewDataDictionary(context.Value); context.ViewContext.TempData = new TempDataDictionary(); viewResult.View.Render(context.ViewContext, sw); viewResult.ViewEngine.ReleaseView(controllerContext, viewResult.View); return new HtmlString(sw.GetStringBuilder().ToString()); } }
private IHtmlString Render(ShapeDescriptor shapeDescriptor, DisplayContext displayContext, HarvestShapeInfo harvestShapeInfo, HarvestShapeHit harvestShapeHit) { Logger.Information("Rendering template file '{0}'", harvestShapeInfo.TemplateVirtualPath); IHtmlString result; if (displayContext.ViewContext.View != null) { var htmlHelper = new HtmlHelper(displayContext.ViewContext, displayContext.ViewDataContainer); result = htmlHelper.Partial(harvestShapeInfo.TemplateVirtualPath, displayContext.Value); } else { // If the View is null, it means that the shape is being executed from a non-view origin / where no ViewContext was established by the view engine, but manually. // Manually creating a ViewContext works when working with Shape methods, but not when the shape is implemented as a Razor view template. // Horrible, but it will have to do for now. result = RenderRazorViewToString(harvestShapeInfo.TemplateVirtualPath, displayContext); } Logger.Information("Done rendering template file '{0}'", harvestShapeInfo.TemplateVirtualPath); return result; }
public IHtmlString Execute(DisplayContext context) { var shape = _convertAsShapeCallsite.Target(_convertAsShapeCallsite, context.Value); // non-shape arguments are returned as a no-op if (shape == null) return CoerceHtmlString(context.Value); var shapeMetadata = shape.Metadata; // can't really cope with a shape that has no type information if (shapeMetadata == null || string.IsNullOrEmpty(shapeMetadata.Type)) return CoerceHtmlString(context.Value); var workContext = _workContextAccessor.GetContext(); var shapeTable = _httpContextAccessor.Current() != null ? _shapeTableLocator.Value.Lookup(workContext.CurrentTheme.Id) : _shapeTableLocator.Value.Lookup(null); var displayingContext = new ShapeDisplayingContext { Shape = shape, ShapeMetadata = shapeMetadata }; _shapeDisplayEvents.Invoke(sde => sde.Displaying(displayingContext), Logger); // find base shape association using only the fundamental shape type. // alternates that may already be registered do not affect the "displaying" event calls ShapeBinding shapeBinding; if (TryGetDescriptorBinding(shapeMetadata.Type, Enumerable.Empty<string>(), shapeTable, out shapeBinding)) { shapeBinding.ShapeDescriptor.Displaying.Invoke(action => action(displayingContext), Logger); // copy all binding sources (all templates for this shape) in order to use them as Localization scopes shapeMetadata.BindingSources = shapeBinding.ShapeDescriptor.BindingSources.Where(x => x != null).ToList(); if (!shapeMetadata.BindingSources.Any()) { shapeMetadata.BindingSources.Add(shapeBinding.ShapeDescriptor.BindingSource); } } // invoking ShapeMetadata displaying events shapeMetadata.Displaying.Invoke(action => action(displayingContext), Logger); // use pre-fectched content if available (e.g. coming from specific cache implmentation) if ( displayingContext.ChildContent != null ) { shape.Metadata.ChildContent = displayingContext.ChildContent; } else { // now find the actual binding to render, taking alternates into account ShapeBinding actualBinding; if ( TryGetDescriptorBinding(shapeMetadata.Type, shapeMetadata.Alternates, shapeTable, out actualBinding) ) { shape.Metadata.ChildContent = Process(actualBinding, shape, context); } else { throw new CoeveryException(T("Shape type {0} not found", shapeMetadata.Type)); } } foreach (var frameType in shape.Metadata.Wrappers) { ShapeBinding frameBinding; if (TryGetDescriptorBinding(frameType, Enumerable.Empty<string>(), shapeTable, out frameBinding)) { shape.Metadata.ChildContent = Process(frameBinding, shape, context); } } var displayedContext = new ShapeDisplayedContext { Shape = shape, ShapeMetadata = shape.Metadata, ChildContent = shape.Metadata.ChildContent, }; _shapeDisplayEvents.Invoke(sde => { var prior = displayedContext.ChildContent = displayedContext.ShapeMetadata.ChildContent; sde.Displayed(displayedContext); // update the child content if the context variable has been reassigned if (prior != displayedContext.ChildContent) displayedContext.ShapeMetadata.ChildContent = displayedContext.ChildContent; }, Logger); if (shapeBinding != null) { shapeBinding.ShapeDescriptor.Displayed.Invoke(action => { var prior = displayedContext.ChildContent = displayedContext.ShapeMetadata.ChildContent; action(displayedContext); // update the child content if the context variable has been reassigned if (prior != displayedContext.ChildContent) displayedContext.ShapeMetadata.ChildContent = displayedContext.ChildContent; }, Logger); } // invoking ShapeMetadata displayed events shapeMetadata.Displayed.Invoke(action => action(displayedContext), Logger); return shape.Metadata.ChildContent; }
static IHtmlString Process(ShapeBinding shapeBinding, IShape shape, DisplayContext context) { if (shapeBinding == null || shapeBinding.Binding == null) { // todo: create result from all child shapes return shape.Metadata.ChildContent ?? new HtmlString(""); } return CoerceHtmlString(shapeBinding.Binding(context)); }