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; } }