Ejemplo n.º 1
0
        public async Task <IActionResult> Content([FromRoute] string name, [FromRoute] string mode, [FromQuery][FromBody] dynamic model)
        {
            var fragment = await _fragmentResolver.ResolveAsync(name);

            var fragmentOptions = _fragmentOptionsProvider.GetFragmentOptions(fragment);
            var fragmentType    = fragment.GetType();

            var methodInfo = fragmentType.GetMethod(Constants.ProcessAsyncMethodName);
            var modelType  = methodInfo.GetParameters().FirstOrDefault();

            var html = await _fragmentRenderer.ExecuteAsync(new FragmentContext
            {
                Fragment        = fragment,
                FragmentOptions = fragmentOptions,
                Model           = model ?? (modelType == null ? null : Activator.CreateInstance(modelType.ParameterType)),
                OutputStream    = HttpContext.Response.Body,
                PlaceHolderId   = Guid.Empty.ToString()
            });

            if (mode == "preview")
            {
                html = AddAssetsToHtml(html, fragmentOptions);
            }

            return(base.Content(html, "text/html"));
        }
        public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            output.TagName = "div";
            Fragment fragment = await _fragmentResolver.ResolveAsync(Name);

            var fragmentOptions = _fragmentOptionsProvider.GetFragmentOptions(fragment);

            var fragmentContext = new FragmentContext
            {
                Fragment        = fragment,
                OutputStream    = ViewContext.HttpContext.Response.Body,
                Model           = Model,
                FragmentOptions = fragmentOptions
            };

            _fragmentContextProvider.AddContext(fragmentContext);

            _fragmentLogger.Info($"Executing fragment {Name}. Model : {JsonConvert.SerializeObject(fragmentContext.Model)}");

            var placeHolderViewName = fragmentOptions?.PlaceHolderViewName;

            if (fragmentOptions?.IsSync == true || fragmentOptions?.IsSyncOnAjax == true && IsAjaxRequest(ViewContext.HttpContext.Request))
            {
                output.SuppressOutput();
                throw new NotImplementedException("Sync fragments are not implemented yet.");
            }
            else
            {
                fragmentContext.PlaceHolderId = Guid.NewGuid().ToString();

                var placeHolderHtml = string.IsNullOrEmpty(placeHolderViewName) ? await fragment.GetPlaceHolderHtmlAsync() : await _viewRenderer.RenderAsync(placeHolderViewName, null);

                if (string.IsNullOrEmpty(placeHolderHtml) == false)
                {
                    output.Content.SetHtmlContent(placeHolderHtml);
                }

                output.Attributes.SetAttribute(Constants.HtmlIdAttribute, fragmentContext.PlaceHolderId);
                output.TagMode = TagMode.StartTagAndEndTag;
            }
        }