public static string ObjectTemplate(IHtmlHelper html) { var viewData = html.ViewData; var templateInfo = viewData.TemplateInfo; var modelMetadata = viewData.ModelMetadata; var builder = new StringBuilder(); if (templateInfo.TemplateDepth > 1) { if (modelMetadata.Model == null) { return(modelMetadata.NullDisplayText); } var text = modelMetadata.SimpleDisplayText; if (modelMetadata.HtmlEncode) { text = html.Encode(text); } return(text); } var serviceProvider = html.ViewContext.HttpContext.RequestServices; var viewEngine = serviceProvider.GetRequiredService <ICompositeViewEngine>(); foreach (var propertyMetadata in modelMetadata.Properties.Where(pm => ShouldShow(pm, templateInfo))) { var divTag = new TagBuilder("div"); if (!propertyMetadata.HideSurroundingHtml) { var label = html.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, html.ViewContext, html.ViewData, propertyMetadata, htmlFieldName: propertyMetadata.PropertyName, templateName: null, readOnly: false, additionalViewData: null); builder.Append(templateBuilder.Build()); if (!propertyMetadata.HideSurroundingHtml) { builder.Append(" "); builder.Append(html.ValidationMessage( propertyMetadata.PropertyName, message: null, htmlAttributes: null, tag: null)); builder.AppendLine(divTag.ToString(TagRenderMode.EndTag)); } } return(builder.ToString()); }
public static string CollectionTemplate(IHtmlHelper html) { var viewData = html.ViewData; var model = viewData.ModelMetadata.Model; if (model == null) { return(string.Empty); } var collection = model as IEnumerable; if (collection == null) { // Only way we could reach here is if user passed templateName: "Collection" to an Editor() overload. throw new InvalidOperationException(Resources.FormatTemplates_TypeMustImplementIEnumerable( "Collection", model.GetType().FullName, typeof(IEnumerable).FullName)); } var typeInCollection = typeof(string); var genericEnumerableType = collection.GetType().ExtractGenericInterface(typeof(IEnumerable <>)); if (genericEnumerableType != null) { typeInCollection = genericEnumerableType.GetGenericArguments()[0]; } var typeInCollectionIsNullableValueType = typeInCollection.IsNullableValueType(); var oldPrefix = viewData.TemplateInfo.HtmlFieldPrefix; try { viewData.TemplateInfo.HtmlFieldPrefix = string.Empty; var fieldNameBase = oldPrefix; var result = new StringBuilder(); var serviceProvider = html.ViewContext.HttpContext.RequestServices; var metadataProvider = serviceProvider.GetRequiredService <IModelMetadataProvider>(); var viewEngine = serviceProvider.GetRequiredService <ICompositeViewEngine>(); var index = 0; foreach (var item in collection) { var itemType = typeInCollection; if (item != null && !typeInCollectionIsNullableValueType) { itemType = item.GetType(); } var metadata = metadataProvider.GetMetadataForType(() => item, itemType); var fieldName = string.Format(CultureInfo.InvariantCulture, "{0}[{1}]", fieldNameBase, index++); var templateBuilder = new TemplateBuilder( viewEngine, html.ViewContext, html.ViewData, metadata, htmlFieldName: fieldName, templateName: null, readOnly: false, additionalViewData: null); var output = templateBuilder.Build(); result.Append(output); } return(result.ToString()); } finally { viewData.TemplateInfo.HtmlFieldPrefix = oldPrefix; } }
public static string CollectionTemplate(IHtmlHelper html) { var model = html.ViewData.ModelMetadata.Model; if (model == null) { return string.Empty; } var collection = model as IEnumerable; if (collection == null) { // Only way we could reach here is if user passed templateName: "Collection" to a Display() overload. throw new InvalidOperationException(Resources.FormatTemplates_TypeMustImplementIEnumerable( "Collection", model.GetType().FullName, typeof(IEnumerable).FullName)); } var typeInCollection = typeof(string); var genericEnumerableType = collection.GetType().ExtractGenericInterface(typeof(IEnumerable<>)); if (genericEnumerableType != null) { typeInCollection = genericEnumerableType.GetGenericArguments()[0]; } var typeInCollectionIsNullableValueType = typeInCollection.IsNullableValueType(); var oldPrefix = html.ViewData.TemplateInfo.HtmlFieldPrefix; try { html.ViewData.TemplateInfo.HtmlFieldPrefix = string.Empty; var fieldNameBase = oldPrefix; var result = new StringBuilder(); var serviceProvider = html.ViewContext.HttpContext.RequestServices; var metadataProvider = serviceProvider.GetService<IModelMetadataProvider>(); var viewEngine = serviceProvider.GetService<ICompositeViewEngine>(); var index = 0; foreach (var item in collection) { var itemType = typeInCollection; if (item != null && !typeInCollectionIsNullableValueType) { itemType = item.GetType(); } var metadata = metadataProvider.GetMetadataForType(() => item, itemType); var fieldName = string.Format(CultureInfo.InvariantCulture, "{0}[{1}]", fieldNameBase, index++); var templateBuilder = new TemplateBuilder( viewEngine, html.ViewContext, html.ViewData, metadata, htmlFieldName: fieldName, templateName: null, readOnly: true, additionalViewData: null); var output = templateBuilder.Build(); result.Append(output); } return result.ToString(); } finally { html.ViewData.TemplateInfo.HtmlFieldPrefix = oldPrefix; } }
public static string ObjectTemplate(IHtmlHelper html) { var viewData = html.ViewData; var templateInfo = viewData.TemplateInfo; var modelMetadata = viewData.ModelMetadata; var builder = new StringBuilder(); if (modelMetadata.Model == null) { return(modelMetadata.NullDisplayText); } if (templateInfo.TemplateDepth > 1) { return(modelMetadata.Model == null ? modelMetadata.NullDisplayText : modelMetadata.SimpleDisplayText); } var serviceProvider = html.ViewContext.HttpContext.RequestServices; var viewEngine = serviceProvider.GetService <ICompositeViewEngine>(); foreach (var propertyMetadata in modelMetadata.Properties.Where(pm => ShouldShow(pm, templateInfo))) { var divTag = new TagBuilder("div"); if (!propertyMetadata.HideSurroundingHtml) { var label = propertyMetadata.GetDisplayName(); if (!string.IsNullOrEmpty(label)) { divTag.SetInnerText(label); divTag.AddCssClass("display-label"); builder.AppendLine(divTag.ToString(TagRenderMode.Normal)); // Reset divTag for reuse. divTag.Attributes.Clear(); } divTag.AddCssClass("display-field"); builder.Append(divTag.ToString(TagRenderMode.StartTag)); } var templateBuilder = new TemplateBuilder( viewEngine, html.ViewContext, html.ViewData, propertyMetadata, htmlFieldName: propertyMetadata.PropertyName, templateName: null, readOnly: true, additionalViewData: null); builder.Append(templateBuilder.Build()); if (!propertyMetadata.HideSurroundingHtml) { builder.AppendLine(divTag.ToString(TagRenderMode.EndTag)); } } return(builder.ToString()); }
public static string ObjectTemplate(IHtmlHelper html) { var viewData = html.ViewData; var templateInfo = viewData.TemplateInfo; var modelMetadata = viewData.ModelMetadata; var builder = new StringBuilder(); if (modelMetadata.Model == null) { return modelMetadata.NullDisplayText; } if (templateInfo.TemplateDepth > 1) { return modelMetadata.Model == null ? modelMetadata.NullDisplayText : modelMetadata.SimpleDisplayText; } var serviceProvider = html.ViewContext.HttpContext.RequestServices; var viewEngine = serviceProvider.GetService<ICompositeViewEngine>(); foreach (var propertyMetadata in modelMetadata.Properties.Where(pm => ShouldShow(pm, templateInfo))) { var divTag = new TagBuilder("div"); // TODO: add ModelMetadata.HideSurroundingHtml and use here (skip this block) { var label = propertyMetadata.GetDisplayName(); if (!string.IsNullOrEmpty(label)) { divTag.SetInnerText(label); divTag.AddCssClass("display-label"); builder.AppendLine(divTag.ToString(TagRenderMode.Normal)); // Reset divTag for reuse. divTag.Attributes.Clear(); } divTag.AddCssClass("display-field"); builder.Append(divTag.ToString(TagRenderMode.StartTag)); } var templateBuilder = new TemplateBuilder( viewEngine, html.ViewContext, html.ViewData, propertyMetadata, htmlFieldName: propertyMetadata.PropertyName, templateName: null, readOnly: true, additionalViewData: null); builder.Append(templateBuilder.Build()); // TODO: add ModelMetadata.HideSurroundingHtml and use here (skip this block) { builder.AppendLine(divTag.ToString(TagRenderMode.EndTag)); } } return builder.ToString(); }
public static IHtmlContent CollectionTemplate(IHtmlHelper htmlHelper) { var viewData = htmlHelper.ViewData; var model = viewData.Model; if (model == null) { return(HtmlString.Empty); } var collection = model as IEnumerable; if (collection == null) { // Only way we could reach here is if user passed templateName: "Collection" to an Editor() overload. throw new InvalidOperationException(Resources.FormatTemplates_TypeMustImplementIEnumerable( "Collection", model.GetType().FullName, typeof(IEnumerable).FullName)); } var elementMetadata = htmlHelper.ViewData.ModelMetadata.ElementMetadata; Debug.Assert(elementMetadata != null); var typeInCollectionIsNullableValueType = elementMetadata.IsNullableValueType; var serviceProvider = htmlHelper.ViewContext.HttpContext.RequestServices; var metadataProvider = serviceProvider.GetRequiredService <IModelMetadataProvider>(); // Use typeof(string) instead of typeof(object) for IEnumerable collections. Neither type is Nullable<T>. if (elementMetadata.ModelType == typeof(object)) { elementMetadata = metadataProvider.GetMetadataForType(typeof(string)); } var oldPrefix = viewData.TemplateInfo.HtmlFieldPrefix; try { viewData.TemplateInfo.HtmlFieldPrefix = string.Empty; var fieldNameBase = oldPrefix; var result = new BufferedHtmlContent(); var viewEngine = serviceProvider.GetRequiredService <ICompositeViewEngine>(); var index = 0; foreach (var item in collection) { var itemMetadata = elementMetadata; if (item != null && !typeInCollectionIsNullableValueType) { itemMetadata = metadataProvider.GetMetadataForType(item.GetType()); } var modelExplorer = new ModelExplorer( metadataProvider, container: htmlHelper.ViewData.ModelExplorer, metadata: itemMetadata, model: item); var fieldName = string.Format(CultureInfo.InvariantCulture, "{0}[{1}]", fieldNameBase, index++); var templateBuilder = new TemplateBuilder( viewEngine, htmlHelper.ViewContext, htmlHelper.ViewData, modelExplorer, htmlFieldName: fieldName, templateName: null, readOnly: false, additionalViewData: null); result.Append(templateBuilder.Build()); } return(result); } finally { viewData.TemplateInfo.HtmlFieldPrefix = oldPrefix; } }
public static IHtmlContent ObjectTemplate(IHtmlHelper htmlHelper) { var viewData = htmlHelper.ViewData; var templateInfo = viewData.TemplateInfo; var modelExplorer = viewData.ModelExplorer; if (templateInfo.TemplateDepth > 1) { if (modelExplorer.Model == null) { return(new HtmlString(modelExplorer.Metadata.NullDisplayText)); } var text = modelExplorer.GetSimpleDisplayText(); if (modelExplorer.Metadata.HtmlEncode) { return(new StringHtmlContent(text)); } return(new HtmlString(text)); } var serviceProvider = htmlHelper.ViewContext.HttpContext.RequestServices; var viewEngine = serviceProvider.GetRequiredService <ICompositeViewEngine>(); var content = new BufferedHtmlContent(); foreach (var propertyExplorer in modelExplorer.Properties) { var propertyMetadata = propertyExplorer.Metadata; if (!ShouldShow(propertyExplorer, templateInfo)) { continue; } var templateBuilder = new TemplateBuilder( viewEngine, htmlHelper.ViewContext, htmlHelper.ViewData, propertyExplorer, htmlFieldName: propertyMetadata.PropertyName, templateName: null, readOnly: false, additionalViewData: null); var templateBuilderResult = templateBuilder.Build(); if (!propertyMetadata.HideSurroundingHtml) { var label = htmlHelper.Label(propertyMetadata.PropertyName, labelText: null, htmlAttributes: null); if (!string.IsNullOrEmpty(label.ToString())) { var labelTag = new TagBuilder("div"); labelTag.AddCssClass("editor-label"); labelTag.InnerHtml = label; content.AppendLine(labelTag); } var valueDivTag = new TagBuilder("div"); valueDivTag.AddCssClass("editor-field"); var innerContent = new BufferedHtmlContent(); innerContent.Append(templateBuilderResult); innerContent.Append(" "); innerContent.Append(htmlHelper.ValidationMessage( propertyMetadata.PropertyName, message: null, htmlAttributes: null, tag: null)); valueDivTag.InnerHtml = innerContent; content.AppendLine(valueDivTag); } else { content.Append(templateBuilderResult); } } return(content); }
protected virtual HtmlString GenerateEditor(ModelMetadata metadata, string htmlFieldName, string templateName, object additionalViewData) { var templateBuilder = new TemplateBuilder( _viewEngine, ViewContext, ViewData, metadata, htmlFieldName, templateName, readOnly: false, additionalViewData: additionalViewData); var templateResult = templateBuilder.Build(); return new HtmlString(templateResult); }
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(); }