internal static string CollectionTemplate(HtmlHelper html, AngularTemplateHelpers.TemplateHelperDelegate templateHelper) { var model = html.ViewContext.ViewData.ModelMetadata.Model; if (model == null) { return(string.Empty); } var enumerable = model as IEnumerable; if (enumerable == null) { throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, "Templates_TypeMustImplementIEnumerable", new object[1] { model.GetType().FullName })); } else { var type = typeof(string); var genericInterface = TypeHelpers.ExtractGenericInterface(enumerable.GetType(), typeof(IEnumerable <>)); if (genericInterface != null) { type = genericInterface.GetGenericArguments()[0]; } var flag = TypeHelpers.IsNullableValueType(type); var htmlFieldPrefix = html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix; try { html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = string.Empty; var str1 = htmlFieldPrefix; var stringBuilder = new StringBuilder(); var num = 0; var enumerator = enumerable.GetEnumerator(); try { while (enumerator.MoveNext()) { var item = enumerator.Current; var modelType = type; if (item != null && !flag) { modelType = item.GetType(); } var metadataForType = ModelMetadataProviders.Current.GetMetadataForType(() => item, modelType); var htmlFieldName = string.Format(CultureInfo.InvariantCulture, "{0}[{1}]", new object[2] { str1, num++ }); var str2 = templateHelper(html, metadataForType, htmlFieldName, null, DataBoundControlMode.Edit, null); stringBuilder.Append(str2); } } finally { var disposable = enumerator as IDisposable; if (disposable != null) { disposable.Dispose(); } } return(stringBuilder.ToString()); } finally { html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = htmlFieldPrefix; } } }