示例#1
0
        public void InvokeViewComponent(string componentName, object parameters, out string viewHtml, out object model, out string viewPath, bool onlyModel = false)
        {
            viewHtml = null;
            model    = null;
            viewPath = null;
            var component = _viewComponentSelector.SelectComponent(componentName);

            if (component == null)
            {
                return;
            }
            if (!onlyModel)
            {
                var componentPath = $"Components/{component.FullName}/Default";
                viewPath = _viewAccountant.GetThemeViewPath(componentPath);
                if (viewPath.IsNullEmptyOrWhiteSpace())
                {
                    return;
                }
                viewHtml = ReadFile.From(viewPath).Content;
            }
            var instance            = DependencyResolver.ResolveOptional(component.TypeInfo.AsType(), true);
            var viewComponentResult = (ViewViewComponentResult)component.MethodInfo.Invoke(instance, new[] { parameters });

            model = viewComponentResult.ViewData.Model;
        }
示例#2
0
        public async Task <IHtmlContent> ContentAsync(IViewComponentHelper helper)
        {
            var actionContext     = _actionContextAccessor.ActionContext;
            var viewComponentName = actionContext.RouteData.DataTokens["ViewComponent"] as string;

            var compositeValueProvider = await CompositeValueProvider.CreateAsync(actionContext, _optionsAccessor.Value.ValueProviderFactories);

            var pluginViewComponent = _viewComponentSelector.SelectComponent(viewComponentName);
            var parameterBinder     = ActivatorUtilities.CreateInstance <ParameterBinder>(_serviceProvider);

            var parameterBag = new Dictionary <string, object>();

            foreach (var parameter in pluginViewComponent.Parameters)
            {
                var parameterDescriptor = new ParameterDescriptor {
                    BindingInfo   = BindingInfo.GetBindingInfo(parameter.GetCustomAttributes()),
                    Name          = parameter.Name,
                    ParameterType = parameter.ParameterType,
                };

                var result = await parameterBinder.BindModelAsync(
                    actionContext,
                    compositeValueProvider,
                    parameterDescriptor);

                parameterBag[parameter.Name] = result.IsModelSet ? result.Model : null;
            }
            return(await helper.InvokeAsync(viewComponentName, parameterBag));
        }
示例#3
0
        public IActionResult Index([FromQuery] string name, [FromBody] Dictionary <string, object> arguments)
        {
            /*
             *  Sample request:
             *  //To return Json use header: X-Response-View = Json
             *  var data = { productThumbPictureSize: 10};
             *      $.ajax({
             *              cache: false,
             *              type: "POST",
             *              url: 'Component/Index?Name=HomePageProducts',
             *              contentType: "application/json",
             *              data: JSON.stringify(data)
             *          }).done(function (data) {
             *              console.log(data)
             *      });
             */

            if (string.IsNullOrEmpty(name))
            {
                return(Content(""));
            }

            var component = _viewComponentSelector.SelectComponent(name);

            if (component == null)
            {
                return(Content("Component not exists"));
            }

            var attribute = component.TypeInfo.GetCustomAttribute <BaseViewComponentAttribute>();

            if (attribute == null || attribute.AdminAccess)
            {
                return(Content("Component - Attribute admin access limited"));
            }

            if (arguments != null)
            {
                var args = new Dictionary <string, object>();
                foreach (var arg in arguments)
                {
                    var key   = arg.Key;
                    var value = arg.Value;
                    if (arg.Value is long)
                    {
                        int.TryParse(arg.Value.ToString(), out var parsevalue);
                        args.Add(key, parsevalue);
                    }
                    else
                    {
                        args.Add(key, value);
                    }
                }
                return(ViewComponent(name, args));
            }
            return(ViewComponent(name));
        }
        private ViewComponentDescriptor SelectComponent(string name)
        {
            var descriptor = _selector.SelectComponent(name);

            if (descriptor == null)
            {
                throw new InvalidOperationException(Resources.FormatViewComponent_CannotFindComponent(name));
            }

            return(descriptor);
        }
示例#5
0
        private Type SelectComponent([NotNull] string name)
        {
            var componentType = _selector.SelectComponent(name);

            if (componentType == null)
            {
                throw new InvalidOperationException(Resources.FormatViewComponent_CannotFindComponent(name));
            }

            return(componentType);
        }
示例#6
0
        private ExpandoObject ToExpando(IQueryCollection query, string viewComponentType)
        {
            ViewComponentDescriptor vcDescriptor = _selector.SelectComponent(viewComponentType);

            if (vcDescriptor == null)
            {
                throw new Exception($"Unable to find definition of ViewComponent ({viewComponentType})");
            }
            MethodBase invokeMethod = vcDescriptor.TypeInfo.GetMethod("InvokeAsync");

            if (invokeMethod == null)
            {
                throw new Exception($"InvokeAsync method not found in ViewComponent ({viewComponentType})");
            }
            ParameterInfo[] paramInfo = invokeMethod.GetParameters();

            var expando = new ExpandoObject() as IDictionary <string, object>;

            foreach (var param in paramInfo)
            {
                if (query.ContainsKey(param.Name))
                {
                    if (param.ParameterType == typeof(string))
                    {
                        expando.Add(param.Name, query[param.Name].ToString());
                    }

                    else if (param.ParameterType == typeof(bool))
                    {
                        expando.Add(param.Name, Convert.ToBoolean(query[param.Name]));
                    }

                    else if (param.ParameterType == typeof(int))
                    {
                        expando.Add(param.Name, Convert.ToInt32(query[param.Name]));
                    }

                    else if (param.ParameterType == typeof(double))
                    {
                        expando.Add(param.Name, Convert.ToDouble(query[param.Name]));
                    }

                    else if (param.ParameterType == typeof(DateTime))
                    {
                        expando.Add(param.Name, Convert.ToDateTime(query[param.Name]));
                    }

                    // TO DO: Add conversions for arrays, collections, and classes
                }
            }
            return((ExpandoObject)expando);
        }
        /// <inheritdoc />
        public Task <IHtmlContent> InvokeAsync(string name, object arguments)
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }

            var descriptor = _selector.SelectComponent(name);

            if (descriptor == null)
            {
                throw new InvalidOperationException(Resources.FormatViewComponent_CannotFindComponent(name));
            }

            return(InvokeCoreAsync(descriptor, arguments));
        }
        /// <inheritdoc />
        public Task <IHtmlContent> InvokeAsync(string name, object arguments)
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }

            var descriptor = _selector.SelectComponent(name);

            if (descriptor == null)
            {
                // Ignore for sub component execution
                return(GetSubComponentExecutionAsync(name));
            }

            return(InvokeCoreAsync(descriptor, arguments));
        }
示例#9
0
        protected bool ValidRequest(string name, out string error)
        {
            error = string.Empty;
            if (string.IsNullOrEmpty(name))
            {
                error = "Component name is empty";
                return(false);
            }
            var component = _viewComponentSelector.SelectComponent(name);

            if (component == null)
            {
                error = "Component not exists";
                return(false);
            }
            var attribute = component.TypeInfo.GetCustomAttribute <BaseViewComponentAttribute>();

            if (attribute != null && attribute.AdminAccess)
            {
                error = "Component - Attribute admin access limited";
                return(false);
            }
            return(true);
        }
示例#10
0
 private bool Exists(string name)
 {
     return(_selector.SelectComponent(name) != null);
 }