コード例 #1
0
        public TemplateItem BuildProductTemplateFromDefinition(ProductDefinition definition)
        {
            var builder    = new TemplateBuilder();
            ID  templateId = definition.SitecoreVariantTemplateId();

            builder.CreateTemplate(definition.Name + " Variant", templateId, definition.Name + " Variant", definition.GetSitecoreBaseVariantTemplateIds());

            _productDefinitionIdToTemplateIdMap[definition.ProductDefinitionId] = templateId;

            var combinedFields = definition.ProductDefinitionFields.Where(x => x.IsVariantProperty && !x.Deleted && !x.DataType.Deleted).ToList();

            if (combinedFields.Any())
            {
                ID  sectionId       = definition.SitecoreTemplateSectionDynamicDefinitionsForVariant(templateId);
                var resourceManager = ObjectFactory.Instance.Resolve <IResourceManager>();
                var userService     = ObjectFactory.Instance.Resolve <IUserService>();
                builder.CreateSection(resourceManager.GetLocalizedText(userService.GetCurrentUserCulture(), "Tabs", "DynamicFields"), sectionId, 150);

                int sortOrder = 10;
                foreach (var definitionField in combinedFields.Where(x => x.RenderInEditor))
                {
                    CreateDynamicItemField(builder, definitionField, sortOrder, sectionId);
                    sortOrder += 10;
                }
            }

            var template = builder.Build();

            template.AddToFieldList(FieldIDs.Icon, SitecoreConstants.UCommerceIconFolder + "/ui/map.png");

            template.SetRevision(definition.Guid.Derived(definition.ModifiedOn));

            return(template);
        }
コード例 #2
0
        public TemplateItem BuildProductTemplateFromDefinition(ProductDefinition definition)
        {
            var builder = new TemplateBuilder();

            ID templateId = definition.SitecoreTemplateId();

            builder.CreateTemplate(definition.Name, templateId, definition.Name, definition.GetSitecoreBaseTemplateIds());
            _productDefinitionIdToTemplateIdMap[definition.ProductDefinitionId] = templateId;

            var definitionFields = definition.ProductDefinitionFields.Where(x => x.RenderInEditor && !x.Deleted && !x.IsVariantProperty).ToList();

            if (definitionFields.Any())
            {
                ID  sectionId       = definition.SitecoreTemplateSectionDynamicDefinitions(templateId);
                var resourceManager = ObjectFactory.Instance.Resolve <IResourceManager>();
                var userService     = ObjectFactory.Instance.Resolve <IUserService>();
                builder.CreateSection(resourceManager.GetLocalizedText(userService.GetCurrentUserCulture(), "Tabs", "DynamicFields"), sectionId, 150);

                int sortOrder = 10;
                foreach (var definitionField in definitionFields)
                {
                    CreateDynamicItemField(builder, definitionField, sortOrder, sectionId);
                    sortOrder += 10;
                }
            }
            var templateItem = builder.Build();

            templateItem.AddToFieldList(FieldIDs.Icon, _iconFolder + "/ui/map.png");
            return(templateItem);
        }
コード例 #3
0
        public static IHtmlContent EditorFor(this IHtmlHelper htmlHelper, ModelMetadata metadata, string templateName,
                                             string htmlFieldName, object additionalViewData)
        {
            Guard.ArgumentNotNull(htmlHelper, nameof(htmlHelper));
            Guard.ArgumentNotNull(metadata, nameof(metadata));
            Guard.ArgumentNotNullOrEmpty(htmlFieldName, nameof(htmlFieldName));

            var viewEngine       = DependencyResolver.Current.GetRequiredService <ICompositeViewEngine>();
            var bufferScope      = DependencyResolver.Current.GetRequiredService <IViewBufferScope>();
            var metadataProvider = DependencyResolver.Current.GetRequiredService <IModelMetadataProvider>();

            var modelExplorer   = new ModelExplorer(metadataProvider, metadata, null);
            var templateBuilder = new TemplateBuilder(
                viewEngine,
                bufferScope,
                htmlHelper.ViewContext,
                htmlHelper.ViewData,
                modelExplorer,
                htmlFieldName,
                templateName,
                readOnly: false,
                additionalViewData: additionalViewData);

            return(templateBuilder.Build());
        }
コード例 #4
0
        public void TestRazorTemplate()
        {
            var builder = new TemplateBuilder();

            Assert.AreEqual(builder.Build("Hello {{Name}}", new Model {
                Name = "Earth"
            }), "Hello Earth");
        }
コード例 #5
0
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (output == null)
            {
                throw new ArgumentNullException(nameof(output));
            }

            output.SuppressOutput();

            Dictionary <string, object> htmlAttributes = new Dictionary <string, object>();

            if (IsDisabled)
            {
                htmlAttributes.Add("disabled", "disabled");
            }

            if (IsRequired)
            {
                output.PreElement.SetHtmlContent("<div class='input-group input-group-required'>");
                output.PostElement.SetHtmlContent("<div class=\"input-group-btn\"><span class=\"required\">*</span></div></div>");
            }

            IViewContextAware viewContextAware = _htmlHelper as IViewContextAware;

            viewContextAware?.Contextualize(ViewContext);

            bool.TryParse(RenderFormControlClass, out bool renderFormControlClass);
            if ((string.IsNullOrEmpty(RenderFormControlClass) && For.Metadata.ModelType.Name.Equals("String")) || renderFormControlClass)
            {
                htmlAttributes.Add("class", "form-control");
            }

            IViewEngine      viewEngine      = CoreUtility.GetPrivateFieldValue(_htmlHelper, "_viewEngine") as IViewEngine;
            IViewBufferScope bufferScope     = CoreUtility.GetPrivateFieldValue(_htmlHelper, "_bufferScope") as IViewBufferScope;
            TemplateBuilder  templateBuilder = new TemplateBuilder(
                viewEngine,
                bufferScope,
                _htmlHelper.ViewContext,
                _htmlHelper.ViewData,
                For.ModelExplorer,
                For.Name,
                Template,
                readOnly: false,
                additionalViewData: new { htmlAttributes, postfix = Postfix });

            IHtmlContent htmlOutput = templateBuilder.Build();

            output.Content.SetHtmlContent(htmlOutput.ToHtmlString());
        }
        public TemplateItem BuildBaseStoreTemplate()
        {
            var builder = new TemplateBuilder();

            builder.CreateTemplate("ProductCatalogGroupBaseTemplate", ProductCatalogGroupBaseTemplateId, "Product Catalog Group Base Template", TemplateIDs.StandardTemplate);

            BuildCommonSection(builder, 100);

            var template = builder.Build();

            template.AddToFieldList(FieldIDs.Icon, SitecoreConstants.UCommerceIconFolder + "/ui/map.png");

            return(template);
        }
コード例 #7
0
        protected virtual IHtmlContent GenerateDisplay(ModelExplorer modelExplorer,
                                                       string htmlFieldName,
                                                       string templateName,
                                                       object additionalViewData)
        {
            var templateBuilder = new TemplateBuilder(_viewEngine,
                                                      ViewContext,
                                                      ViewData,
                                                      modelExplorer,
                                                      htmlFieldName,
                                                      templateName,
                                                      readOnly: true,
                                                      additionalViewData: additionalViewData);

            return(templateBuilder.Build());
        }
コード例 #8
0
        public TemplateItem BuildBaseProductTemplate()
        {
            var builder = new TemplateBuilder();

            _priceGroupFields = new Dictionary <int, PriceGroupFieldData>();

            builder.CreateTemplate("VariantBaseTemplate", VariantBaseTemplateId, "Variant Base Template", TemplateIDs.StandardTemplate);

            BuildCommonSection(builder, 100);
            BuildPriceGroupSections(builder, 300);

            var template = builder.Build();

            template.AddToFieldList(FieldIDs.Icon, SitecoreConstants.UCommerceIconFolder + "/ui/map.png");

            return(template);
        }
コード例 #9
0
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            if (output == null)
            {
                throw new ArgumentNullException(nameof(output));
            }

            var builder = new TemplateBuilder(_viewEngine, _bufferScope, ViewContext, ViewContext.ViewData,
                                              For.ModelExplorer, For.Name, templateName: null, readOnly: true, additionalViewData: null);

            output.PreContent.SetHtmlContent(builder.Build());

            if (output.TagName == "text")
            {
                output.TagName = null;
            }
        }
コード例 #10
0
        static void Main(string[] args)
        {
            var notesBuilderConfiguration    = new NotesBuilderConfiguration();
            var templateBuilderConfiguration = new TemplateBuilderConfiguration();

            var options = new OptionSet
            {
                { "gn:", "GitHub User Name", (o) => notesBuilderConfiguration.GithubOwnerName = o },
                { "gt:", "GitHub Access Token", o => notesBuilderConfiguration.GithubAccessToken = o },
                { "jn:", "Jira User Name", o => notesBuilderConfiguration.JiraUsername = o },
                { "jp:", "Jira Password", o => notesBuilderConfiguration.JiraPassword = o },
                { "rn:", "Repository Name", o => templateBuilderConfiguration.RepositoryName = o },
                { "bn:", "Branch Name", o => templateBuilderConfiguration.BranchName = o },
                { "tn:", "Tag Name", o => templateBuilderConfiguration.TagName = o },
                { "tp:", "Task Prefixes", o => templateBuilderConfiguration.TaskPrefixes = ParseTaskPrefixes(o) },
                { "tpn:", "Template Name", o => templateBuilderConfiguration.TemplateName = o }
            };

            try
            {
                options.Parse(args);

                var    notesBuilder    = new NotesBuilder(notesBuilderConfiguration);
                var    templateBuilder = new TemplateBuilder(notesBuilder);
                string documentBody    = templateBuilder.Build(templateBuilderConfiguration.RepositoryName,
                                                               templateBuilderConfiguration.BranchName,
                                                               templateBuilderConfiguration.TagName,
                                                               templateBuilderConfiguration.TaskPrefixes,
                                                               templateBuilderConfiguration.TemplateName);

                Console.WriteLine(documentBody);

                Console.ReadKey();
            }
            catch (OptionException e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine("Try `--help' for more information.");
            }
        }
コード例 #11
0
        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 HtmlContentBuilder();
                var viewEngine = serviceProvider.GetRequiredService<ICompositeViewEngine>();
                var viewBufferScope = serviceProvider.GetRequiredService<IViewBufferScope>();

                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,
                        viewBufferScope,
                        htmlHelper.ViewContext,
                        htmlHelper.ViewData,
                        modelExplorer,
                        htmlFieldName: fieldName,
                        templateName: null,
                        readOnly: false,
                        additionalViewData: null);
                    result.AppendHtml(templateBuilder.Build());
                }

                return result;
            }
            finally
            {
                viewData.TemplateInfo.HtmlFieldPrefix = oldPrefix;
            }
        }
コード例 #12
0
        /// <summary>
        /// Process
        /// </summary>
        /// <param name="context">Context</param>
        /// <param name="output">Output</param>
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (output == null)
            {
                throw new ArgumentNullException(nameof(output));
            }

            //clear the output
            output.SuppressOutput();

            //container for additional attributes
            Dictionary <string, object> htmlAttributes = new Dictionary <string, object>();

            //disabled attribute
            bool.TryParse(IsDisabled, out bool disabled);
            if (disabled)
            {
                htmlAttributes.Add("disabled", "disabled");
            }

            //required asterisk
            bool.TryParse(IsRequired, out bool required);
            if (required)
            {
                output.PreElement.SetHtmlContent("<div class='input-group input-group-required'>");
                output.PostElement.SetHtmlContent("<div class=\"input-group-btn\"><span class=\"required\">*</span></div></div>");
            }

            //contextualize IHtmlHelper
            IViewContextAware viewContextAware = _htmlHelper as IViewContextAware;

            viewContextAware?.Contextualize(ViewContext);

            //add form-control class
            bool.TryParse(RenderFormControlClass, out bool renderFormControlClass);
            if (string.IsNullOrEmpty(RenderFormControlClass) && For.Metadata.ModelType.Name.Equals("String") || renderFormControlClass)
            {
                htmlAttributes.Add("class", "form-control");
            }

            //generate editor

            //we have to invoke strong typed "EditorFor" method of HtmlHelper<TModel>
            //but we cannot do it because we don't have access to Expression<Func<TModel, TValue>>
            //more info at https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewFeatures/HtmlHelperOfT.cs

            //so we manually invoke implementation of "GenerateEditor" method of HtmlHelper
            //more info at https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewFeatures/HtmlHelper.cs

            //little workaround here. we need to access private properties of HtmlHelper
            //just ensure that they are not renamed by asp.net core team in future versions
            IViewEngine      viewEngine      = CommonHelper.GetPrivateFieldValue(_htmlHelper, "_viewEngine") as IViewEngine;
            IViewBufferScope bufferScope     = CommonHelper.GetPrivateFieldValue(_htmlHelper, "_bufferScope") as IViewBufferScope;
            TemplateBuilder  templateBuilder = new TemplateBuilder(
                viewEngine,
                bufferScope,
                _htmlHelper.ViewContext,
                _htmlHelper.ViewData,
                For.ModelExplorer,
                For.Name,
                Template,
                readOnly: false,
                additionalViewData: new { htmlAttributes, postfix = this.Postfix });

            Microsoft.AspNetCore.Html.IHtmlContent htmlOutput = templateBuilder.Build();
            output.Content.SetHtmlContent(htmlOutput.RenderHtmlContent());
        }
コード例 #13
0
        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 viewBufferScope = serviceProvider.GetRequiredService<IViewBufferScope>();

            var content = new HtmlContentBuilder();
            foreach (var propertyExplorer in modelExplorer.Properties)
            {
                var propertyMetadata = propertyExplorer.Metadata;
                if (!ShouldShow(propertyExplorer, templateInfo))
                {
                    continue;
                }

                var templateBuilder = new TemplateBuilder(
                    viewEngine,
                    viewBufferScope,
                    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.SetContent(label);
                        content.AppendLine(labelTag);
                    }

                    var valueDivTag = new TagBuilder("div");
                    valueDivTag.AddCssClass("editor-field");

                    valueDivTag.InnerHtml.AppendHtml(templateBuilderResult);
                    valueDivTag.InnerHtml.AppendHtml(" ");
                    valueDivTag.InnerHtml.AppendHtml(htmlHelper.ValidationMessage(
                        propertyMetadata.PropertyName,
                        message: null,
                        htmlAttributes: null,
                        tag: null));

                    content.AppendLine(valueDivTag);
                }
                else
                {
                    content.AppendHtml(templateBuilderResult);
                }
            }

            return content;
        }
コード例 #14
0
        public static IHtmlContent CollectionTemplate(IHtmlHelper htmlHelper)
        {
            var model = htmlHelper.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 a Display() 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 = htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix;

            try
            {
                htmlHelper.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: true,
                        additionalViewData: null);
                    result.Append(templateBuilder.Build());
                }

                return(result);
            }
            finally
            {
                htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix = oldPrefix;
            }
        }
コード例 #15
0
        public static string ObjectTemplate(IHtmlHelper htmlHelper)
        {
            var viewData = htmlHelper.ViewData;
            var templateInfo = viewData.TemplateInfo;
            var modelExplorer = viewData.ModelExplorer;
            var builder = new StringBuilder();

            if (modelExplorer.Model == null)
            {
                return modelExplorer.Metadata.NullDisplayText;
            }

            if (templateInfo.TemplateDepth > 1)
            {
                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 = 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,
                    htmlHelper.ViewContext,
                    htmlHelper.ViewData,
                    propertyExplorer,
                    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();
        }
コード例 #16
0
        public static string CollectionTemplate(IHtmlHelper htmlHelper)
        {
            var viewData = htmlHelper.ViewData;
            var model = viewData.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 = ClosedGenericMatcher.ExtractGenericInterface(
                collection.GetType(),
                typeof(IEnumerable<>));
            if (genericEnumerableType != null)
            {
                typeInCollection = genericEnumerableType.GenericTypeArguments[0];
            }

            var typeInCollectionIsNullableValueType = TypeHelper.IsNullableValueType(typeInCollection);
            var oldPrefix = viewData.TemplateInfo.HtmlFieldPrefix;

            try
            {
                viewData.TemplateInfo.HtmlFieldPrefix = string.Empty;

                var fieldNameBase = oldPrefix;
                var result = new StringBuilder();

                var serviceProvider = htmlHelper.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 modelExplorer = metadataProvider.GetModelExplorerForType(itemType, 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);

                    var output = templateBuilder.Build();
                    result.Append(output);
                }

                return result.ToString();
            }
            finally
            {
                viewData.TemplateInfo.HtmlFieldPrefix = oldPrefix;
            }
        }
コード例 #17
0
        public static IHtmlContent ObjectTemplate(IHtmlHelper htmlHelper)
        {
            var viewData      = htmlHelper.ViewData;
            var templateInfo  = viewData.TemplateInfo;
            var modelExplorer = viewData.ModelExplorer;

            if (modelExplorer.Model == null)
            {
                return(new HtmlString(modelExplorer.Metadata.NullDisplayText));
            }

            if (templateInfo.TemplateDepth > 1)
            {
                var text = modelExplorer.GetSimpleDisplayText();
                if (modelExplorer.Metadata.HtmlEncode)
                {
                    text = htmlHelper.Encode(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: true,
                    additionalViewData: null);

                var templateBuilderResult = templateBuilder.Build();
                if (!propertyMetadata.HideSurroundingHtml)
                {
                    var label = propertyMetadata.GetDisplayName();
                    if (!string.IsNullOrEmpty(label))
                    {
                        var labelTag = new TagBuilder("div");
                        labelTag.InnerHtml.SetContent(label);
                        labelTag.AddCssClass("display-label");
                        content.AppendLine(labelTag);
                    }

                    var valueDivTag = new TagBuilder("div");
                    valueDivTag.AddCssClass("display-field");
                    valueDivTag.InnerHtml.SetContent(templateBuilderResult);
                    content.AppendLine(valueDivTag);
                }
                else
                {
                    content.Append(templateBuilderResult);
                }
            }

            return(content);
        }
コード例 #18
0
    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 viewBufferScope = serviceProvider.GetRequiredService <IViewBufferScope>();

        var content = new HtmlContentBuilder(modelExplorer.Metadata.Properties.Count);

        foreach (var propertyExplorer in modelExplorer.PropertiesInternal)
        {
            var propertyMetadata = propertyExplorer.Metadata;
            if (!ShouldShow(propertyExplorer, templateInfo))
            {
                continue;
            }

            var templateBuilder = new TemplateBuilder(
                viewEngine,
                viewBufferScope,
                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);
                using (var writer = new HasContentTextWriter())
                {
                    label.WriteTo(writer, PassThroughHtmlEncoder.Default);
                    if (writer.HasContent)
                    {
                        var labelTag = new TagBuilder("div");
                        labelTag.AddCssClass("editor-label");
                        labelTag.InnerHtml.SetHtmlContent(label);
                        content.AppendLine(labelTag);
                    }
                }

                var valueDivTag = new TagBuilder("div");
                valueDivTag.AddCssClass("editor-field");

                valueDivTag.InnerHtml.AppendHtml(templateBuilderResult);
                valueDivTag.InnerHtml.AppendHtml(" ");
                valueDivTag.InnerHtml.AppendHtml(htmlHelper.ValidationMessage(
                                                     propertyMetadata.PropertyName,
                                                     message: null,
                                                     htmlAttributes: null,
                                                     tag: null));

                content.AppendLine(valueDivTag);
            }
            else
            {
                content.AppendHtml(templateBuilderResult);
            }
        }

        return(content);
    }
コード例 #19
0
ファイル: EditorTagHelper.cs プロジェクト: hfz-r/mynews-sms
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (output == null)
            {
                throw new ArgumentNullException(nameof(output));
            }

            //clear the output
            output.SuppressOutput();

            //container for additional attributes
            var htmlAttributes = new Dictionary <string, object>();

            //disabled attribute
            bool.TryParse(IsDisabled, out bool disabled);
            if (disabled)
            {
                htmlAttributes.Add("disabled", "disabled");
            }

            //readonly attribute
            bool.TryParse(IsReadOnly, out bool @readonly);
            if (@readonly)
            {
                htmlAttributes.Add("readonly", "readonly");
            }

            //required asterisk
            bool.TryParse(IsRequired, out bool required);
            if (required)
            {
                output.PreElement.SetHtmlContent("<div class='input-group input-group-required'>");
                output.PostElement.SetHtmlContent("<div class=\"input-group-btn\"><span class=\"required\">*</span></div></div>");
            }

            var viewContextAware = _htmlHelper as IViewContextAware;

            viewContextAware?.Contextualize(ViewContext);

            //add form-control class
            bool.TryParse(RenderFormControlClass, out bool renderFormControlClass);
            if (string.IsNullOrEmpty(RenderFormControlClass) && For.Metadata.ModelType.Name.Equals("String") || renderFormControlClass)
            {
                htmlAttributes.Add("class", "form-control");
            }

            var viewEngine      = CommonHelper.GetPrivateFieldValue(_htmlHelper, "_viewEngine") as IViewEngine;
            var bufferScope     = CommonHelper.GetPrivateFieldValue(_htmlHelper, "_bufferScope") as IViewBufferScope;
            var templateBuilder = new TemplateBuilder(
                viewEngine,
                bufferScope,
                _htmlHelper.ViewContext,
                _htmlHelper.ViewData,
                For.ModelExplorer,
                For.Name,
                Template,
                readOnly: false,
                additionalViewData: new { htmlAttributes, postfix = this.Postfix });

            var htmlOutput = templateBuilder.Build();

            output.Content.SetHtmlContent(htmlOutput.RenderHtmlContent());
        }
コード例 #20
0
        public void ReturnsUnchangedSampleWhenItDoesntMatchAnyWords()
        {
            var result = sut.Build("abc", new[] { "1", "2", "3" });

            Assert.AreEqual("abc", result);
        }
コード例 #21
0
        public static IHtmlContent ObjectTemplate(IHtmlHelper htmlHelper)
        {
            if (htmlHelper == null)
            {
                throw new ArgumentNullException(nameof(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 viewBufferScope = serviceProvider.GetRequiredService <IViewBufferScope>();

            var content = new HtmlContentBuilder(modelExplorer.Metadata.Properties.Count);

            foreach (var propertyExplorer in modelExplorer.Properties)
            {
                var propertyMetadata = propertyExplorer.Metadata;
                if (!ShouldShow(propertyExplorer, templateInfo))
                {
                    continue;
                }

                var templateBuilder = new TemplateBuilder(
                    viewEngine,
                    viewBufferScope,
                    htmlHelper.ViewContext,
                    htmlHelper.ViewData,
                    propertyExplorer,
                    htmlFieldName: propertyMetadata.PropertyName,
                    templateName: null,
                    readOnly: false,
                    additionalViewData: null);

                var templateBuilderResult = templateBuilder.Build();
                if (!propertyMetadata.HideSurroundingHtml)
                {
                    var groupTag          = new TagBuilder("div");
                    var isBooleanProperty = propertyMetadata.ModelType == typeof(bool) || propertyMetadata.ModelType == typeof(bool?);
                    if (!isBooleanProperty)
                    {
                        groupTag.AddCssClass("form-group");
                        var label = htmlHelper.Label(propertyMetadata.PropertyName, labelText: null, htmlAttributes: null);
                        using (var writer = new HasContentTextWriter())
                        {
                            label.WriteTo(writer, PassThroughHtmlEncoder.Default);
                            if (writer.HasContent)
                            {
                                groupTag.InnerHtml.AppendHtml(label);
                            }
                        }
                    }

                    groupTag.InnerHtml.AppendHtml(templateBuilderResult);

                    if (isBooleanProperty)
                    {
                        groupTag.AddCssClass("form-check");
                        var label = htmlHelper.Label(propertyMetadata.PropertyName, labelText: null, htmlAttributes: new { @class = "form-check-label" });
                        using (var writer = new HasContentTextWriter())
                        {
                            label.WriteTo(writer, PassThroughHtmlEncoder.Default);
                            if (writer.HasContent)
                            {
                                groupTag.InnerHtml.AppendHtml(label);
                            }
                        }
                    }

                    content.AppendLine(groupTag);
                }
                else
                {
                    content.AppendHtml(templateBuilderResult);
                }
            }

            return(content);
        }
コード例 #22
0
        /// <summary>
        /// Process
        /// </summary>
        /// <param name="context">Context</param>
        /// <param name="output">Output</param>
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (output == null)
            {
                throw new ArgumentNullException(nameof(output));
            }

            //clear the output
            output.SuppressOutput();

            //disabled attribute
            bool.TryParse(IsDisabled, out bool disabled);
            if (disabled)
            {
                var d = new TagHelperAttribute("disabled", "disabled");
                output.Attributes.Add(d);
            }

            //required asterisk
            bool.TryParse(IsRequired, out bool required);
            if (required)
            {
                output.PreElement.SetHtmlContent("<div class='input-group input-group-required'>");
                output.PostElement.SetHtmlContent("<div class=\"input-group-btn\"><span class=\"required\">*</span></div></div>");
            }

            //contextualize IHtmlHelper
            var viewContextAware = _htmlHelper as IViewContextAware;

            viewContextAware?.Contextualize(ViewContext);

            //add form-control class
            bool.TryParse(RenderFormControlClass, out bool renderFormControlClass);
            object htmlAttributes = null;

            if (string.IsNullOrEmpty(RenderFormControlClass) && For.Metadata.ModelType.Name.Equals("String") || renderFormControlClass)
            {
                htmlAttributes = new { @class = "form-control k-input" }
            }
            ;

            var viewEngine  = GetPrivateFieldValue(_htmlHelper, "_viewEngine") as IViewEngine;
            var bufferScope = GetPrivateFieldValue(_htmlHelper, "_bufferScope") as IViewBufferScope;

            if (SelectItems != null)
            {
                if (SelectItems.Any())
                {
                    if (_htmlHelper.ViewData.ContainsKey("SelectList"))
                    {
                        _htmlHelper.ViewData["SelectList"] = SelectItems;
                    }
                    else
                    {
                        _htmlHelper.ViewData.Add("SelectList", SelectItems);
                    }
                }
                else
                {
                    if (_htmlHelper.ViewData.ContainsKey("SelectList"))
                    {
                        _htmlHelper.ViewData["SelectList"] = new List <SelectListItem>();
                    }
                    else
                    {
                        _htmlHelper.ViewData.Add("SelectList", new List <SelectListItem>());
                    }
                }
            }
            var templateBuilder = new TemplateBuilder(
                viewEngine,
                bufferScope,
                _htmlHelper.ViewContext,
                _htmlHelper.ViewData,
                For.ModelExplorer,
                For.Name,
                Template,
                readOnly: false,
                additionalViewData: new { htmlAttributes, postfix = this.Postfix });

            var htmlOutput = templateBuilder.Build();

            output.Content.SetHtmlContent(htmlOutput.RenderHtmlContent());
        }