コード例 #1
0
ファイル: TemplateHelpers.cs プロジェクト: consumentor/Server
        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));
        }
コード例 #2
0
        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));
        }