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; }
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)); }
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); }
private Type SelectComponent([NotNull] string name) { var componentType = _selector.SelectComponent(name); if (componentType == null) { throw new InvalidOperationException(Resources.FormatViewComponent_CannotFindComponent(name)); } return(componentType); }
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)); }
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); }
private bool Exists(string name) { return(_selector.SelectComponent(name) != null); }