internal static string CollectionTemplate(HtmlHelper html, TemplateHelpers.TemplateHelperDelegate templateHelper) { ViewDataDictionary viewData = html.ViewContext.ViewData; object model = viewData.ModelMetadata.Model; if (model == null) { return(String.Empty); } IEnumerable collection = model as IEnumerable; if (collection == null) { throw new InvalidOperationException( String.Format( CultureInfo.CurrentCulture, MvcResources.Templates_TypeMustImplementIEnumerable, model.GetType().FullName)); } Type typeInCollection = typeof(string); Type genericEnumerableType = TypeHelpers.ExtractGenericInterface(collection.GetType(), typeof(IEnumerable <>)); if (genericEnumerableType != null) { typeInCollection = genericEnumerableType.GetGenericArguments()[0]; } bool typeInCollectionIsNullableValueType = TypeHelpers.IsNullableValueType(typeInCollection); string oldPrefix = viewData.TemplateInfo.HtmlFieldPrefix; try { viewData.TemplateInfo.HtmlFieldPrefix = String.Empty; string fieldNameBase = oldPrefix; StringBuilder result = new StringBuilder(); int index = 0; foreach (object item in collection) { Type itemType = typeInCollection; if (item != null && !typeInCollectionIsNullableValueType) { itemType = item.GetType(); } ModelMetadata metadata = ModelMetadataProviders.Current.GetMetadataForType(() => item, itemType); string fieldName = String.Format(CultureInfo.InvariantCulture, "{0}[{1}]", fieldNameBase, index++); string output = templateHelper(html, metadata, fieldName, null /* templateName */, DataBoundControlMode.Edit, null /* additionalViewData */); result.Append(output); } return(result.ToString()); } finally { viewData.TemplateInfo.HtmlFieldPrefix = oldPrefix; } }
internal static string ObjectTemplate(HtmlHelper html, TemplateHelpers.TemplateHelperDelegate templateHelper) { ViewDataDictionary viewData = html.ViewContext.ViewData; TemplateInfo templateInfo = viewData.TemplateInfo; ModelMetadata modelMetadata = viewData.ModelMetadata; StringBuilder builder = new StringBuilder(); if (templateInfo.TemplateDepth > 1) { if (modelMetadata.Model == null) { return(modelMetadata.NullDisplayText); } // DDB #224751 string text = modelMetadata.SimpleDisplayText; if (modelMetadata.HtmlEncode) { text = html.Encode(text); } return(text); } foreach (ModelMetadata propertyMetadata in modelMetadata.Properties.Where(pm => ShouldShow(pm, templateInfo))) { if (!propertyMetadata.HideSurroundingHtml) { string label = LabelExtensions.LabelHelper(html, propertyMetadata, propertyMetadata.PropertyName).ToHtmlString(); if (!String.IsNullOrEmpty(label)) { builder.AppendFormat(CultureInfo.InvariantCulture, "<div class=\"editor-label\">{0}</div>\r\n", label); } builder.Append("<div class=\"editor-field\">"); } builder.Append(templateHelper(html, propertyMetadata, propertyMetadata.PropertyName, null /* templateName */, DataBoundControlMode.Edit, null /* additionalViewData */)); if (!propertyMetadata.HideSurroundingHtml) { builder.Append(" "); builder.Append(html.ValidationMessage(propertyMetadata.PropertyName)); builder.Append("</div>\r\n"); } } return(builder.ToString()); }
internal static string ObjectTemplate(HtmlHelper html, TemplateHelpers.TemplateHelperDelegate templateHelper) { ViewDataDictionary viewData = html.ViewContext.ViewData; TemplateInfo templateInfo = viewData.TemplateInfo; ModelMetadata modelMetadata = viewData.ModelMetadata; StringBuilder builder = new StringBuilder(); if (modelMetadata.Model == null) { // DDB #225237 return(modelMetadata.NullDisplayText); } if (templateInfo.TemplateDepth > 1) { // DDB #224751 return(modelMetadata.SimpleDisplayText); } foreach (ModelMetadata propertyMetadata in modelMetadata.Properties.Where(pm => ShouldShow(pm, templateInfo))) { if (!propertyMetadata.HideSurroundingHtml) { string label = propertyMetadata.GetDisplayName(); if (!String.IsNullOrEmpty(label)) { builder.AppendFormat(CultureInfo.InvariantCulture, "<div class=\"display-label\">{0}</div>", label); builder.AppendLine(); } builder.Append("<div class=\"display-field\">"); } builder.Append(templateHelper(html, propertyMetadata, propertyMetadata.PropertyName, null /* templateName */, DataBoundControlMode.ReadOnly, null /* additionalViewData */)); if (!propertyMetadata.HideSurroundingHtml) { builder.AppendLine("</div>"); } } return(builder.ToString()); }
internal static void CollectionTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput, TemplateHelpers.TemplateHelperDelegate templateHelper) { ViewDataDictionary viewData = html.ViewData; object?model = viewData.ModelMetadata.Model; if (model is null) { return; } IEnumerable collection = model as IEnumerable ?? throw new InvalidOperationException($"The Collection template was used with an object of type '{model.GetType().FullName}', which does not implement System.IEnumerable."); Type typeInCollection = typeof(string); Type?genericEnumerableType = TypeHelpers.ExtractGenericInterface(collection.GetType(), typeof(IEnumerable <>)); if (genericEnumerableType != null) { typeInCollection = genericEnumerableType.GetGenericArguments()[0]; } bool typeInCollectionIsNullableValueType = TypeHelpers.IsNullableValueType(typeInCollection); string oldPrefix = viewData.TemplateInfo.HtmlFieldPrefix; try { viewData.TemplateInfo.HtmlFieldPrefix = String.Empty; string fieldNameBase = oldPrefix; int index = 0; foreach (object item in collection) { Type itemType = typeInCollection; if (item != null && !typeInCollectionIsNullableValueType) { itemType = item.GetType(); } ModelMetadata metadata = ModelMetadataProviders.Current.GetMetadataForType(() => item, itemType); string fieldName = String.Format(CultureInfo.InvariantCulture, "{0}[{1}]", fieldNameBase, index++); templateHelper( html, package, seqOutput, metadata, htmlFieldName: fieldName, templateName: null, membersNames: null, DataBoundControlMode.ReadOnly, additionalViewData: null ); } } finally { viewData.TemplateInfo.HtmlFieldPrefix = oldPrefix; } }
internal static void ObjectTemplate(HtmlHelper html, IXcstPackage package, ISequenceWriter <object> seqOutput, TemplateHelpers.TemplateHelperDelegate templateHelper) { ViewDataDictionary viewData = html.ViewData; ModelMetadata modelMetadata = viewData.ModelMetadata; if (modelMetadata.Model is null || viewData.TemplateInfo.TemplateDepth > 1) { MetadataInstructions.DisplayTextHelper(html, seqOutput, modelMetadata); return; } var filteredProperties = DisplayInstructions.DisplayProperties(html); var groupedProperties = filteredProperties.GroupBy(p => p.GroupName()); bool createFieldset = groupedProperties.Any(g => g.Key != null); foreach (var group in groupedProperties) { XcstWriter?fieldsetWriter = null; if (createFieldset) { fieldsetWriter = DocumentWriter.CastElement(package, seqOutput); fieldsetWriter.WriteStartElement("fieldset"); fieldsetWriter.WriteStartElement("legend"); fieldsetWriter.WriteString(group.Key); fieldsetWriter.WriteEndElement(); } foreach (ModelMetadata propertyMeta in group) { XcstWriter?fieldWriter = null; if (!propertyMeta.HideSurroundingHtml) { XcstDelegate <object>?memberTemplate = DisplayInstructions.MemberTemplate(html, propertyMeta); if (memberTemplate != null) { memberTemplate(null !/* argument is not used */, fieldsetWriter ?? seqOutput); continue; } XcstWriter labelWriter = fieldsetWriter ?? DocumentWriter.CastElement(package, seqOutput); labelWriter.WriteStartElement("div"); labelWriter.WriteAttributeString("class", "display-label"); labelWriter.WriteString(propertyMeta.GetDisplayName() ?? String.Empty); labelWriter.WriteEndElement(); fieldWriter = fieldsetWriter ?? DocumentWriter.CastElement(package, seqOutput); fieldWriter.WriteStartElement("div"); fieldWriter.WriteAttributeString("class", "display-field"); } templateHelper( html, package, fieldWriter ?? fieldsetWriter ?? seqOutput, propertyMeta, htmlFieldName: propertyMeta.PropertyName, templateName: null, membersNames: null, DataBoundControlMode.ReadOnly, additionalViewData: null ); if (!propertyMeta.HideSurroundingHtml) { fieldWriter !.WriteEndElement(); // </div> } } if (createFieldset) { fieldsetWriter !.WriteEndElement(); // </fieldset> } } }