public static string ObjectTemplate(IHtmlHelper htmlHelper) { var viewData = htmlHelper.ViewData; var templateInfo = viewData.TemplateInfo; var modelExplorer = viewData.ModelExplorer; var builder = new StringBuilder(); if (templateInfo.TemplateDepth > 1) { if (modelExplorer.Model == null) { return(modelExplorer.Metadata.NullDisplayText); } var text = modelExplorer.GetSimpleDisplayText(); if (modelExplorer.Metadata.HtmlEncode) { text = htmlHelper.Encode(text); } return(text); } var serviceProvider = htmlHelper.ViewContext.HttpContext.RequestServices; var viewEngine = serviceProvider.GetRequiredService <ICompositeViewEngine>(); foreach (var propertyExplorer in modelExplorer.Properties) { var propertyMetadata = propertyExplorer.Metadata; if (!ShouldShow(propertyExplorer, templateInfo)) { continue; } var divTag = new TagBuilder("div", htmlHelper.HtmlEncoder); if (!propertyMetadata.HideSurroundingHtml) { var label = htmlHelper.Label( propertyMetadata.PropertyName, labelText: null, htmlAttributes: null) .ToString(); if (!string.IsNullOrEmpty(label)) { divTag.AddCssClass("editor-label"); divTag.InnerHtml = label; // already escaped builder.AppendLine(divTag.ToString(TagRenderMode.Normal)); // Reset divTag for reuse. divTag.Attributes.Clear(); } divTag.AddCssClass("editor-field"); builder.Append(divTag.ToString(TagRenderMode.StartTag)); } var templateBuilder = new TemplateBuilder( viewEngine, htmlHelper.ViewContext, htmlHelper.ViewData, propertyExplorer, htmlFieldName: propertyMetadata.PropertyName, templateName: null, readOnly: false, additionalViewData: null); builder.Append(templateBuilder.Build()); if (!propertyMetadata.HideSurroundingHtml) { builder.Append(" "); builder.Append(htmlHelper.ValidationMessage( propertyMetadata.PropertyName, message: null, htmlAttributes: null, tag: null)); builder.AppendLine(divTag.ToString(TagRenderMode.EndTag)); } } return(builder.ToString()); }