internal static string TemplateHelper(HtmlHelper html, ModelMetadata metadata, string htmlFieldName, string templateName, DataBoundControlMode mode, object additionalViewData, ExecuteTemplateDelegate executeTemplate) { // TODO: Convert Editor into Display if model.IsReadOnly is true? Need to be careful about this because // the Model property on the ViewPage/ViewUserControl is get-only, so the type descriptor automatically // decorates it with a [ReadOnly] attribute... if (metadata.ConvertEmptyStringToNull && String.Empty.Equals(metadata.Model)) { metadata.Model = null; } object formattedModelValue = metadata.Model; if (metadata.Model == null && mode == DataBoundControlMode.ReadOnly) { formattedModelValue = metadata.NullDisplayText; } string formatString = mode == DataBoundControlMode.ReadOnly ? metadata.DisplayFormatString : metadata.EditFormatString; if (metadata.Model != null && !String.IsNullOrEmpty(formatString)) { formattedModelValue = String.Format(CultureInfo.CurrentCulture, formatString, metadata.Model); } // Normally this shouldn't happen, unless someone writes their own custom Object templates which // don't check to make sure that the object hasn't already been displayed object visitedObjectsKey = metadata.Model ?? metadata.RealModelType; if (html.ViewDataContainer.ViewData.TemplateInfo.VisitedObjects.Contains(visitedObjectsKey)) // DDB #224750 { return(String.Empty); } ViewDataDictionary viewData = new ViewDataDictionary(html.ViewDataContainer.ViewData) { Model = metadata.Model, ModelMetadata = metadata, TemplateInfo = new TemplateInfo { FormattedModelValue = formattedModelValue, HtmlFieldPrefix = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName), VisitedObjects = new HashSet <object>(html.ViewContext.ViewData.TemplateInfo.VisitedObjects), // DDB #224750 } }; if (additionalViewData != null) { foreach (KeyValuePair <string, object> kvp in new RouteValueDictionary(additionalViewData)) { viewData[kvp.Key] = kvp.Value; } } viewData.TemplateInfo.VisitedObjects.Add(visitedObjectsKey); // DDB #224750 return(executeTemplate(html, viewData, templateName, mode, GetViewNames)); }
internal static string TemplateHelper(HtmlHelper html, ModelMetadata metadata, string htmlFieldName, string templateName, DataBoundControlMode mode, object additionalViewData, ExecuteTemplateDelegate executeTemplate) { if (metadata.ConvertEmptyStringToNull && string.Empty.Equals(metadata.Model)) { metadata.Model = null; } var obj1 = metadata.Model; if (metadata.Model == null && mode == DataBoundControlMode.ReadOnly) { obj1 = metadata.NullDisplayText; } var format = mode == DataBoundControlMode.ReadOnly ? metadata.DisplayFormatString : metadata.EditFormatString; if (metadata.Model != null && !string.IsNullOrEmpty(format)) { obj1 = string.Format(CultureInfo.CurrentCulture, format, new object[1] { metadata.Model }); } var obj2 = metadata.Model ?? metadata.ModelType; if (html.ViewDataContainer.ViewData.TemplateInfo.GetPrivatePropertyValue <HashSet <object> >("VisitedObjects").Contains(obj2)) { return(string.Empty); } var viewData = new ViewDataDictionary(html.ViewDataContainer.ViewData) { Model = metadata.Model, ModelMetadata = metadata, TemplateInfo = new TemplateInfo() { FormattedModelValue = obj1, HtmlFieldPrefix = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName) } }; viewData.TemplateInfo.SetPrivatePropertyValue <HashSet <object> >("VisitedObjects", new HashSet <object>(html.ViewContext.ViewData.TemplateInfo.GetPrivatePropertyValue <HashSet <object> >("VisitedObjects"))); if (additionalViewData != null) { foreach (var keyValuePair in new RouteValueDictionary(additionalViewData)) { viewData[keyValuePair.Key] = keyValuePair.Value; } } viewData.TemplateInfo.GetPrivatePropertyValue <HashSet <object> >("VisitedObjects").Add(obj2); return(executeTemplate(html, viewData, templateName, mode, GetViewNames, GetDefaultActions)); }