예제 #1
0
        public override TagBuilder GenerateValidationMessage(
            ViewContext viewContext,
            ModelExplorer modelExplorer,
            string expression,
            string message,
            string tag,
            object htmlAttributes)
        {
            if (viewContext == null)
            {
                throw new ArgumentNullException(nameof(viewContext));
            }

            if (string.IsNullOrEmpty(tag))
            {
                tag = viewContext.ValidationMessageElement;
            }

            var fullName = NameAndIdProvider.GetFullHtmlFieldName(viewContext, expression);
            var htmlAttributeDictionary = GetHtmlAttributeDictionaryOrNull(htmlAttributes);

            var tagBuilder = new TagBuilder(tag);

            tagBuilder.MergeAttributes(htmlAttributeDictionary);
            tagBuilder.AddCssClass(_options.ValidationMessageCssClassName);

            // The span will only appear when there's an error in the error bag for the field .
            tagBuilder.MergeAttribute("v-show", $"{_options.ErrorBagName}.has('{fullName}')");
            tagBuilder.InnerHtml.SetHtmlContent(new HtmlString($"{{{{{_options.ErrorBagName}.first('{fullName}')}}}}"));

            return(tagBuilder);
        }
예제 #2
0
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            context.ThrowIfNull();
            output.ThrowIfNull();

            var kvList          = Data.GetKeyValueList();
            var selectListItems = kvList.Select(a => new SelectListItem {
                Text = a.Key, Value = a.Value.ToString(), Selected = a.Value == (int)(For.Model ?? -1)
            }).ToList();

            if (!DefaultText.IsNullOrEmpty())
            {
                selectListItems.Insert(0, new SelectListItem {
                    Text = DefaultText, Value = ""
                });
            }
            var tagBuilder = _generator.GenerateSelect(ViewContext, For.ModelExplorer, null, For.Name, selectListItems, null, false, null);

            output.Content.AppendHtml(tagBuilder);
            output.TagName = "div";
            output.TagMode = TagMode.StartTagAndEndTag;
            output.Attributes.Add("class", InputDisplay.GetDisplayName());

            var idStr = NameAndIdProvider.CreateSanitizedId(ViewContext, For.Name,
                                                            _generator.IdAttributeDotReplacement);

            if (Data == null && !Url.IsNullOrEmpty())
            {
                output.PostElement.SetHtmlContent(string.Format(@"<script type='text/javascript'>
                 $(function () {{
                    $('#{0}').bindSelectData('{1}','{2}');
                    }});
                </script>", idStr, Url, For.Model));
            }
        }
예제 #3
0
        public static TagBuilder GenerateCheckboxBooleanButton(ViewContext viewContext, ModelExplorer modelExplorer, string expression, string text, bool?isChecked, object divHtmlAttributes, object inputHtmlAttributes, object labelHtmlAttributes)
        {
            var htmlGenerator = viewContext.HttpContext.RequestServices.GetRequiredService <IHtmlGenerator>();
            var name          = NameAndIdProvider.GetFullHtmlFieldName(viewContext, expression);

            var div = new TagBuilder("div");

            div.MergeAttributes(GetHtmlAttributeDictionaryOrNull(divHtmlAttributes));

            var input        = htmlGenerator.GenerateCheckBox(viewContext, modelExplorer, expression, isChecked, inputHtmlAttributes);
            var inputChecked = input.Render().Contains("checked");

            var label = new TagBuilder("label");

            label.MergeAttributes(GetHtmlAttributeDictionaryOrNull(labelHtmlAttributes));

            if (inputChecked)
            {
                label.AddCssClass("active");
            }

            label.InnerHtml.AppendHtml(input);
            label.InnerHtml.AppendHtml(text);

            div.InnerHtml.AppendHtml(label);

            return(div);
        }
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            base.Process(context, output);

            if (ViewContext == null || For == null)
            {
                return;
            }

            var id = NameAndIdProvider.GetFullHtmlFieldName(ViewContext, For.Name);

            if (!ViewContext.ModelState.TryGetValue(id, out var modelStateEntry))
            {
                return;
            }

            if (modelStateEntry.ValidationState != Microsoft.AspNetCore.Mvc.ModelBinding.ModelValidationState.Invalid)
            {
                return;
            }

            output.MergeAttributes(new TagBuilder(output.TagName)
            {
                Attributes = { { "class", "is-invalid" } }
            });
        }
예제 #5
0
        /// <inheritdoc />
        public virtual TagBuilder GenerateLabel(ViewContext viewContext, string fullName, Column column, string labelText, object htmlAttributes)
        {
            if (viewContext == null)
            {
                throw new ArgumentNullException(nameof(viewContext));
            }

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

            var resolvedLabelText = labelText;

            if (string.IsNullOrEmpty(resolvedLabelText))
            {
                resolvedLabelText = column.DisplayName;
            }
            if (string.IsNullOrEmpty(resolvedLabelText))
            {
                resolvedLabelText = column.Name;
            }

            var tagBuilder = new TagBuilder("label");
            var idString   = NameAndIdProvider.CreateSanitizedId(viewContext, fullName, IdAttributeDotReplacement);

            tagBuilder.Attributes.Add("for", idString);
            tagBuilder.InnerHtml.SetContent(resolvedLabelText);
            tagBuilder.MergeAttributes(GetHtmlAttributeDictionaryOrNull(htmlAttributes), replaceExisting: true);

            return(tagBuilder);
        }
예제 #6
0
        public static TagBuilder GenerateCheckboxBoolean(ViewContext viewContext, ModelExplorer modelExplorer, string expression, string text, bool?isChecked, object divHtmlAttributes, object inputHtmlAttributes, object labelHtmlAttributes)
        {
            var htmlGenerator = viewContext.HttpContext.RequestServices.GetRequiredService <IHtmlGenerator>();

            var div = new TagBuilder("div");

            div.MergeAttributes(GetHtmlAttributeDictionaryOrNull(divHtmlAttributes));

            var name = NameAndIdProvider.GetFullHtmlFieldName(viewContext, expression);
            var id   = NameAndIdProvider.CreateSanitizedId(viewContext, name, htmlGenerator.IdAttributeDotReplacement);

            var input = htmlGenerator.GenerateCheckBox(viewContext, modelExplorer, expression, isChecked, inputHtmlAttributes);

            //var checkboxHtml = htmlHelper.CheckBox(expression, isChecked, htmlAttributes).Render().Replace("true", value);

            var label = new TagBuilder("label");

            label.MergeAttributes(GetHtmlAttributeDictionaryOrNull(labelHtmlAttributes));
            label.InnerHtml.AppendHtml(text);

            div.InnerHtml.AppendHtml(input);
            if (!string.IsNullOrEmpty(text))
            {
                div.InnerHtml.AppendHtml(label);
            }

            return(div);
        }
예제 #7
0
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            context.ThrowIfNull();
            output.ThrowIfNull();

            var selectListItems = new List <SelectListItem>();
            var kvList          = For?.Metadata.EnumGroupedDisplayNamesAndValues;

            if (kvList != null)
            {
                selectListItems = For.Metadata.EnumGroupedDisplayNamesAndValues.Select(a => new SelectListItem {
                    Text = a.Key.Name.ToString(), Value = a.Value.ToString(), Selected = a.Value == ((int)((For.Model) ?? -1)).ToString()
                }).ToList();
            }

            if (kvList == null && Data != null)
            {
                selectListItems = (List <SelectListItem>)Data;
            }

            var idStr = NameAndIdProvider.CreateSanitizedId(ViewContext, For.Name, _generator.IdAttributeDotReplacement);

            var tagBuilder = new StringBuilder(32);

            selectListItems.ForEach(item =>
            {
                var attributes = new Dictionary <string, object>
                {
                    { "title", item.Text },
                    { "lay-skin", "primary" }
                };
                var inputTagBuilder = _generator.GenerateCheckBox(ViewContext,
                                                                  For.ModelExplorer,
                                                                  For.Name,
                                                                  item.Value == (string)For.ModelExplorer.Model,
                                                                  attributes);
                tagBuilder.Append(inputTagBuilder.GetString());
            });

            var outpuHtml = $@"
              <label class='layui-form-label'>{Text ?? For.Metadata.DisplayName}</label>
            <div id='{idStr}_checkGroup' class='layui-input-block'>
              {tagBuilder}
            </div>";

            output.TagName = "div";
            output.TagMode = TagMode.StartTagAndEndTag;
            output.Attributes.Add("class", InputDisplay.GetDisplayName());
            output.Attributes.Add("id", $"{idStr}_div");
            output.Content.SetHtmlContent(outpuHtml);
            if (kvList == null && !Url.IsNullOrEmpty())
            {
                output.PostElement.SetHtmlContent($@"<script type='text/javascript'>
                 $(function () {{
                    $('#{idStr}_checkGroup').bindCheckBoxData('{Url}','{For.Model}','{For.Name}');
                    }});
                </script>");
            }
        }
        /// Computes the variant to be unique for each radiobutton.
        private string VariantId(KeyValuePair <string, string> enumItem)
        {
            var fullHtmlFieldName = NameAndIdProvider.GetFullHtmlFieldName(ViewContext, For.Name);

            return(new StringBuilder()
                   .Append(NameAndIdProvider.CreateSanitizedId(ViewContext, fullHtmlFieldName, _generator.IdAttributeDotReplacement))
                   .Append(_generator.IdAttributeDotReplacement)
                   .Append(enumItem.Key)
                   .ToString());
        }
예제 #9
0
        /// <inheritdoc />
        public virtual TagBuilder GenerateSelect(
            ViewContext viewContext,
            string fullHtmlFieldName,
            Column column,
            string optionLabel,
            IEnumerable <SelectListItem> selectList,
            ICollection <string> currentValues,
            bool allowMultiple,
            object htmlAttributes)
        {
            if (viewContext == null)
            {
                throw new ArgumentNullException(nameof(viewContext));
            }

            if (string.IsNullOrEmpty(fullHtmlFieldName))
            {
                throw new ArgumentNullException(nameof(fullHtmlFieldName));
            }

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

            var htmlAttributeDictionary = GetHtmlAttributeDictionaryOrNull(htmlAttributes);

            // Convert each ListItem to an <option> tag and wrap them with <optgroup> if requested.
            var listItemBuilder = GenerateGroupsAndOptions(optionLabel, selectList, currentValues);

            var tagBuilder = new TagBuilder("select");

            tagBuilder.InnerHtml.SetHtmlContent(listItemBuilder);
            tagBuilder.MergeAttributes(htmlAttributeDictionary);
            NameAndIdProvider.GenerateId(viewContext, tagBuilder, fullHtmlFieldName, IdAttributeDotReplacement);
            tagBuilder.MergeAttribute("name", fullHtmlFieldName, replaceExisting: true);

            if (allowMultiple)
            {
                tagBuilder.MergeAttribute("multiple", "multiple");
            }

            // If there are any errors for a named field, we add the css attribute.
            if (viewContext.ViewData.ModelState.TryGetValue(fullHtmlFieldName, out var entry))
            {
                if (entry.Errors.Count > 0)
                {
                    tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
                }
            }

            AddValidationAttributes(viewContext, tagBuilder, fullHtmlFieldName, column);

            return(tagBuilder);
        }
예제 #10
0
파일: Monaco.cs 프로젝트: aiplugs/tags
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            if (ModelExpression != null)
            {
                var expression = ModelExpression.Name;
                var name       = NameAndIdProvider.GetFullHtmlFieldName(ViewContext, expression);

                if (Name == null)
                {
                    Name = name;
                }

                if (Value == null)
                {
                    Value = (string)AiplugsField.GetModelStateValue(ViewContext, Name, typeof(string)) ?? ModelExpression.ModelExplorer.Model?.ToString();
                }
            }
            var id = Guid.NewGuid().ToString();

            output.TagName = "div";
            output.TagMode = TagMode.StartTagAndEndTag;
            output.Attributes.Add("id", id);
            output.Attributes.Merge("class", "aiplugs-monaco");
            output.Attributes.Add("data-controller", "aiplugs-monaco");

            if (!string.IsNullOrEmpty(ValueFrom))
            {
                output.Attributes.Add("data-aiplugs-monaco-value-from", ValueFrom);
            }

            if (!string.IsNullOrEmpty(SettingsFrom))
            {
                output.Attributes.Add("data-aiplugs-monaco-settings-from", SettingsFrom);
            }

            if (!string.IsNullOrEmpty(JsonSchemas))
            {
                output.Attributes.Add("data-aiplugs-monaco-json-schemas", JsonSchemas);
            }

            output.Content.AppendHtml("<div class=\"aiplugs-progress\" data-target=\"aiplugs-monaco.progress\"></div>");

            output.Tag("textarea", () => {
                if (Name != null)
                {
                    output.Attr("name", Name);
                }

                output.Attr("class", "aiplugs-monaco__input");
                output.Attr("data-target", "aiplugs-monaco.textarea");
            }, Value);
        }
예제 #11
0
        public static TagBuilder GenerateRadioValue(ViewContext viewContext, ModelExplorer modelExplorer, string expression, bool inline, string value, string text, bool?isChecked, object divHtmlAttributes, object inputHtmlAttributes, object labelHtmlAttributes)
        {
            var htmlGenerator = viewContext.HttpContext.RequestServices.GetRequiredService <IHtmlGenerator>();
            var name          = NameAndIdProvider.GetFullHtmlFieldName(viewContext, expression);
            // var radioHtml = htmlHelper.RadioButton(expression, value, isChecked, htmlAttributes).Render();

            var div = new TagBuilder("div");

            div.MergeAttributes(GetHtmlAttributeDictionaryOrNull(divHtmlAttributes));

            if (inline)
            {
                div.AddCssClass("form-check-inline");
            }
            else
            {
                div.AddCssClass("form-check");
            }

            var inputHtmlAttributesDict = GetHtmlAttributeDictionaryOrNull(inputHtmlAttributes) ?? new Dictionary <string, object>();

            if (!inputHtmlAttributesDict.ContainsKey("class"))
            {
                inputHtmlAttributesDict.Add("class", "form-check-input");
            }
            else
            {
                inputHtmlAttributesDict["class"] = inputHtmlAttributesDict["class"] + " " + "form-check-input";
            }

            inputHtmlAttributes = GetAnonymousObject(inputHtmlAttributesDict);

            var input = htmlGenerator.GenerateRadioButton(viewContext, modelExplorer, expression, value, isChecked, inputHtmlAttributes);

            //var checkboxHtml = htmlHelper.CheckBox(expression, isChecked, htmlAttributes).Render().Replace("true", value);

            var label = new TagBuilder("label");

            label.MergeAttributes(GetHtmlAttributeDictionaryOrNull(labelHtmlAttributes));
            label.InnerHtml.AppendHtml(text);

            label.AddCssClass("form-check-label");

            div.InnerHtml.AppendHtml(input);

            if (!string.IsNullOrEmpty(text))
            {
                div.InnerHtml.AppendHtml(label);
            }

            return(div);
        }
예제 #12
0
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            context.ThrowIfNull();
            output.ThrowIfNull();

            var modelExplorer = For.ModelExplorer;
            var attributes    = new Dictionary <string, object>
            {
                { PlaceholderAttributeName, Placeholder ?? modelExplorer.Metadata.Description ?? modelExplorer.Metadata.DisplayName },
                { "class", "layui-input" }
            };

            if (modelExplorer.Metadata != null && modelExplorer.Metadata.IsRequired)
            {
                attributes["required"] = "required";
            }

            var value = modelExplorer.Model ?? Value;

            if (value is DateTime)
            {
                value = ((DateTime)value).ToString(FormatByType(DateTimeType));
            }
            var inputTagBuilder = _generator.GenerateTextBox(ViewContext,
                                                             modelExplorer,
                                                             For.Name,
                                                             value,
                                                             Format,
                                                             attributes);

            output.TagName = "div";
            output.TagMode = TagMode.StartTagAndEndTag;
            output.Content.SetHtmlContent(inputTagBuilder);
            output.Attributes.Add("class", InputDisplay.GetDisplayName());

            var dateTimeTypeStr = DateTimeType.ToString();
            var idStr           = NameAndIdProvider.CreateSanitizedId(ViewContext, For.Name,
                                                                      _generator.IdAttributeDotReplacement);

            output.PostElement.SetHtmlContent(string.Format(@"<script type='text/javascript'>
             layui.use('laydate',
                    function () {{
                        var laydate = layui.laydate;
                        laydate.render({{
                            elem: '#{0}',
                            type: '{1}'
                        }});
                    }});
            </script>", idStr, dateTimeTypeStr));
        }
예제 #13
0
        public string GetDomId()
        {
            if (Id != null)
            {
                return(Id);
            }

            if (Name != null)
            {
                return(NameAndIdProvider.CreateSanitizedId(ViewContext, Name, "_"));
            }

            return(null);
        }
예제 #14
0
        protected virtual void ExtractFromModelExpression()
        {
            if (ModelExpression != null)
            {
                var modelExplorer = ModelExpression.ModelExplorer;
                var expression    = ModelExpression.Name;
                var name          = NameAndIdProvider.GetFullHtmlFieldName(ViewContext, expression);

                if (Id == null)
                {
                    Id = NameAndIdProvider.CreateSanitizedId(ViewContext, name, "_");
                }

                if (Name == null)
                {
                    Name = name;
                }

                if (Label == null)
                {
                    var label = modelExplorer.Metadata.DisplayName ?? modelExplorer.Metadata.PropertyName;
                    if (label == null && expression != null)
                    {
                        var index = expression.LastIndexOf('.');
                        if (index == -1)
                        {
                            // Expression does not contain a dot separator.
                            label = expression;
                        }
                        else
                        {
                            label = expression.Substring(index + 1);
                        }
                    }
                    Label = label;
                }

                if (Description == null)
                {
                    Description = modelExplorer.Metadata.Description;
                }

                if (modelExplorer.Metadata.ValidatorMetadata.Any(attribute => attribute is RequiredAttribute))
                {
                    Required = true;
                }
            }
        }
예제 #15
0
        public static async Task <IEnumerable <ModelSelectListItem <TModel> > > SelectListForModelTypeAsync <TModel>(this IHtmlHelper htmlHelper, object[] keys, string selectListId = null) where TModel : class, new()
        {
            var newhtmlHelper = htmlHelper.For <List <TModel> >();

            var fullName = NameAndIdProvider.GetFullHtmlFieldName(newhtmlHelper.ViewContext, "");
            var keyArray = keys.Select(key => key.ToString()).ToArray();

            newhtmlHelper.ViewContext.ViewData.ModelState.SetModelValue(fullName, keyArray, String.Join(",", keyArray));

            var result = await newhtmlHelper.SelectListAsync("", selectListId, keyArray.Length > 0?true : false);

            if (result != null)
            {
                return(result.Cast <ModelSelectListItem>().Select(item => new ModelSelectListItem <TModel>(item)));
            }

            return(null);
        }
예제 #16
0
        private static string GetFullHtmlFieldName(this ViewContext viewContext, string expression, DataSet dataSet, bool isScalar, Column column, DataRow dataRow)
        {
            if (dataSet == null)
            {
                throw new ArgumentNullException(nameof(dataSet));
            }

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

            VerifyDataRow(dataRow, column, dataSet, isScalar);

            var memberName      = ResolveMemberName(dataSet, isScalar, column, dataRow);
            var fullDataSetName = NameAndIdProvider.GetFullHtmlFieldName(viewContext, expression);

            return(ModelNames.CreatePropertyModelName(fullDataSetName, memberName));
        }
예제 #17
0
        public static TagBuilder GenerateRadioValueButton(ViewContext viewContext, ModelExplorer modelExplorer, string expression, string value, string text, bool?isChecked, object inputHtmlAttributes, object labelHtmlAttributes)
        {
            var htmlGenerator = viewContext.HttpContext.RequestServices.GetRequiredService <IHtmlGenerator>();
            var name          = NameAndIdProvider.GetFullHtmlFieldName(viewContext, expression);

            var inputHtmlAttributesDict = GetHtmlAttributeDictionaryOrNull(inputHtmlAttributes) ?? new Dictionary <string, object>();

            if (!inputHtmlAttributesDict.ContainsKey("autocomplete"))
            {
                inputHtmlAttributesDict.Add("autocomplete", "off");
            }
            if (!inputHtmlAttributesDict.ContainsKey("class"))
            {
                inputHtmlAttributesDict.Add("class", "");
            }

            inputHtmlAttributes = GetAnonymousObject(inputHtmlAttributesDict);

            var input        = htmlGenerator.GenerateRadioButton(viewContext, modelExplorer, expression, value, isChecked, inputHtmlAttributes);
            var inputChecked = input.Render().Contains("checked");

            //var checkboxHtml = htmlHelper.CheckBox(expression, isChecked, htmlAttributes).Render().Replace("true", value);

            var label = new TagBuilder("label");

            label.MergeAttributes(GetHtmlAttributeDictionaryOrNull(labelHtmlAttributes));


            label.MergeAttribute("class", "btn btn-outline-secondary mr-2 mb-2 btn-sm", false);

            if (inputChecked)
            {
                label.AddCssClass("active");
            }

            label.InnerHtml.AppendHtml(input);
            label.InnerHtml.AppendHtml(text);

            return(label);
        }
예제 #18
0
        /// <inheritdoc />
        /// <remarks>Does nothing if <see cref="For"/> is <c>null</c>.</remarks>
        public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

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

            if (For != null)
            {
                var fullName = NameAndIdProvider.GetFullHtmlFieldName(ViewContext, For.Name);
                if (ViewContext.ViewData.ModelState.TryGetValue(fullName, out var entry) && entry.Errors.Count > 0)
                {
                    TagHelperAttribute classAttribute;

                    if (output.Attributes.TryGetAttribute("class", out classAttribute))
                    {
                        output.Attributes.SetAttribute("class", classAttribute.Value + " " + HasValidationErrorClassName);
                    }
                    else
                    {
                        output.Attributes.Add("class", HasValidationErrorClassName);
                    }
                }

                // We check for whitespace to detect scenarios such as:
                // <span validation-for="Name">
                // </span>
                if (!output.IsContentModified)
                {
                    var childContent = await output.GetChildContentAsync();

                    output.Content.SetHtmlContent(childContent);
                }
            }
        }
예제 #19
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));
            }

            if (this.Name != null)
            {
                if (this.Name.Metadata == null)
                {
                    throw new ArgumentException(nameof(Name));
                }

                string value = NameAndIdProvider.GetFullHtmlFieldName(ViewContext, this.Name.Name);

                output.Attributes.SetAttribute("name", value);
            }
        }
예제 #20
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));
            }

            if (this.Id != null)
            {
                if (this.Id.Metadata == null)
                {
                    throw new ArgumentException(nameof(Id));
                }

                string idFieldName  = NameAndIdProvider.GetFullHtmlFieldName(ViewContext, this.Id.Name);
                string idFieldValue = NameAndIdProvider.CreateSanitizedId(this.ViewContext, idFieldName, _generator.IdAttributeDotReplacement);

                output.Attributes.SetAttribute("id", idFieldValue);
            }
        }
예제 #21
0
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            context.ThrowIfNull();
            output.ThrowIfNull();

            var selectListItems = new List <SelectListItem>();
            var kvList          = For?.Metadata.EnumGroupedDisplayNamesAndValues;

            if (kvList != null)
            {
                selectListItems = For.Metadata.EnumGroupedDisplayNamesAndValues.Select(a => new SelectListItem
                {
                    Text  = a.Key.Name.ToString(),
                    Value = a.Value.ToString()
                }).ToList();
            }

            if (kvList == null && Data != null)
            {
                selectListItems = ((IEnumerable <SelectListItem>)Data).ToList();
            }

            if (!DefaultText.IsNullOrWhiteSpace())
            {
                selectListItems.Insert(0, new SelectListItem {
                    Text = DefaultText, Value = ""
                });
            }

            var idStr      = NameAndIdProvider.CreateSanitizedId(ViewContext, For.Name, _generator.IdAttributeDotReplacement);
            var attributes = new Dictionary <string, object>
            {
                { "xm-select", idStr },
                { "xm-select-skin", "default" }
            };

            IList l = new ArrayList();

            if (For.Model != null)
            {
                l = (IList)For.Model;
            }

            selectListItems.ForEach(item =>
            {
                item.Selected = For.Model != null && l.Contains(item.Value);
            });

            var tagBuilder = _generator.GenerateSelect(ViewContext, For.ModelExplorer, null, For.Name, selectListItems, null, false, attributes);

            var outpuHtml = $@"
              <label class='layui-form-label'>{Text ?? For.Metadata.DisplayName}</label>
            <div class='layui-input-block'>
              {tagBuilder.GetString().Replace("&amp;nbsp;", "&nbsp;")}
            </div>";

            output.TagName = "div";
            output.TagMode = TagMode.StartTagAndEndTag;
            output.Attributes.Add("id", $"{idStr}_div");
            output.Attributes.Add("class", InputDisplay.GetDisplayName());
            output.Content.SetHtmlContent(outpuHtml);

            var jsValue = l.Cast <object>().Aggregate("", (current, t) => current + (t + ",")).TrimEnd(',');

            if (kvList == null && !Url.IsNullOrEmpty())
            {
                output.PostElement.SetHtmlContent($@"<script type='text/javascript'>
                 $(function () {{
                    $('#{idStr}').bindMultiSelectData('{Url}','{jsValue}','{idStr}');
                    }});
                </script>");
            }
        }
예제 #22
0
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            context.ThrowIfNull();
            output.ThrowIfNull();

            var modelExplorer = For.ModelExplorer;

            var attributes = new Dictionary <string, object>
            {
                { PlaceholderAttributeName, Placeholder },
                { TextAttributeName, Text ?? modelExplorer.Metadata.Description ?? modelExplorer.Metadata.DisplayName },
                { "class", "layui-input" }
            };

            if (Disabled)
            {
                attributes["Disabled"] = "Disabled";
            }

            var value = modelExplorer.Model ?? Value;

            var htmlText  = !attributes[TextAttributeName].ToStr().IsNullOrWhiteSpace() ? $"<label class='layui-form-label'>{attributes[TextAttributeName]}</label>" : "";
            var outpuHtml = $@"
                    {htmlText}
                    <div class='layui-input-inline'>
                        <button id='btn_{For.Name}_up' type='button' class='layui-btn' >上传图片</button>
                <img class='layui-upload-img' id='{For.Name}_imgs1' src='{value}' style='max-width:200px' />
                <p id='{For.Name}_retry'></p>
                <input  id='{For.Name}_imgs2' type = 'hidden' value='{value}' name='{For.Name}'>
                <div>请上传100px*100px的图片</div>
                    </div>";

            var idStr = NameAndIdProvider.CreateSanitizedId(ViewContext, For.Name, _generator.IdAttributeDotReplacement);

            output.TagName = "div";
            output.TagMode = TagMode.StartTagAndEndTag;
            output.Attributes.Add("class", "layui-form-item");
            output.Attributes.Add("id", $"{idStr}_div");
            output.Content.SetHtmlContent(outpuHtml);

            output.PostElement.SetHtmlContent($@" <script type='text/javascript'>
$(function () {{
                var imageUrl;
            var $ = layui.jquery;
            var upload = layui.upload;

            var uploadInst = upload.render({{
                elem: '#btn_{For.Name}_up',
                url: '/Upload/Img',
                before: function (obj) {{
                    obj.preview(function (index, file, result) {{
                        if (file.size / 1024 / 1024 > 2) {{
                            layer.msg('上传的图片不能超过1M',
                            {{
                                icon: 2,
                                time: 2000
                            }});
                            return false;
                        }}
                        $('#{For.Name}_imgs1').attr('src', result);
                    }});
                }},
                done: function (res) {{
                    if (res.success) {{
                        if (res.data) {{
                            imageUrl = res.data;
                                $('#{For.Name}_imgs2').val(imageUrl);
                        }}
                    }} else {{
                        var demoText = $('#{For.Name}_retry');
                        demoText.html(""<span style='color: #FF5722;'>上传失败</span> <a class='layui-btn layui-btn-xs demo-reload'>重试</a>"");
                        demoText.find('.demo-reload').on('click', function () {{
                            uploadInst.upload();
                        }});
                    }}
                }}
            }});
            }});
            </script>");
        }
예제 #23
0
        public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

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

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

            output.TagName = "label";
            TagBuilder tagBuilder = new TagBuilder("label");
            bool       isRequired = Required ?? For.Metadata.AdditionalValues.TryGetValue("PLRequired", out _);

            if (isRequired)
            {
                tagBuilder.MergeAttribute("class", "label-required");
                tagBuilder.MergeAttribute("title", _localizer["Yêu cầu nhập."]);
            }

            string fullName = NameAndIdProvider.GetFullHtmlFieldName(ViewContext, For.Name);
            string idString = NameAndIdProvider.CreateSanitizedId(ViewContext, fullName, optionsAccessor.Value.HtmlHelperOptions.IdAttributeDotReplacement);

            tagBuilder.Attributes.Add("for", idString);

            string labelText = For.ModelExplorer.Metadata.DisplayName ?? For.Name ?? For.ModelExplorer.Metadata.PropertyName;

            tagBuilder.InnerHtml.SetContent(labelText);

            if (!string.IsNullOrEmpty(DisplayHint))
            {
                TagBuilder builder = new TagBuilder("i");
                builder.MergeAttribute("class", "fa fa-question-circle info hellp-hit");
                builder.MergeAttribute("data-toggle", "tooltip");
                builder.MergeAttribute("data-placement", "top");
                builder.MergeAttribute("title", DisplayHint);
                tagBuilder.InnerHtml.AppendHtml(builder);
            }

            output.MergeAttributes(tagBuilder);
            if (!output.IsContentModified)
            {
                TagHelperContent childContent = await output.GetChildContentAsync();

                if (childContent.IsEmptyOrWhiteSpace)
                {
                    if (tagBuilder.HasInnerHtml)
                    {
                        output.Content.SetHtmlContent(tagBuilder.InnerHtml);
                    }
                }
                else
                {
                    output.Content.SetHtmlContent(childContent);
                }
            }
        }
예제 #24
0
        public static TagBuilder GenerateCheckboxValueButton(ViewContext viewContext, ModelExplorer modelExplorer, string expression, string value, string text, bool?isChecked, object inputHtmlAttributes, object labelHtmlAttributes)
        {
            var htmlGenerator = viewContext.HttpContext.RequestServices.GetRequiredService <IHtmlGenerator>();
            var name          = NameAndIdProvider.GetFullHtmlFieldName(viewContext, expression);
            var id            = NameAndIdProvider.CreateSanitizedId(viewContext, name, htmlGenerator.IdAttributeDotReplacement);

            var input = new TagBuilder("input");

            input.MergeAttributes(GetHtmlAttributeDictionaryOrNull(inputHtmlAttributes));
            input.MergeAttribute("autocomplete", "off", false);
            input.MergeAttribute("id", id, true);
            input.MergeAttribute("name", name, false);
            input.MergeAttribute("type", "checkbox", true);
            input.MergeAttribute("value", value, false);

            if (modelExplorer != null)
            {
                if (modelExplorer.Model != null)
                {
                    isChecked = string.Equals(modelExplorer.Model.ToString(), value, StringComparison.Ordinal);
                }
            }

            if (GetModelStateValue(viewContext, name, typeof(string[])) is string[] modelStateValues)
            {
                isChecked = modelStateValues.Any(v => string.Equals(v, value, StringComparison.Ordinal));
            }
            else if (GetModelStateValue(viewContext, name, typeof(string)) is string modelStateValue)
            {
                isChecked = string.Equals(modelStateValue, value, StringComparison.Ordinal);
            }

            if (isChecked.HasValue && isChecked.Value)
            {
                input.MergeAttribute("checked", "checked");
            }

            //var checkboxHtml = htmlHelper.CheckBox(expression, isChecked, htmlAttributes).Render().Replace("true", value);

            var label = new TagBuilder("label");

            label.MergeAttributes(GetHtmlAttributeDictionaryOrNull(labelHtmlAttributes));
            label.MergeAttribute("class", "btn btn-outline-secondary mr-2 mb-2 btn-sm", false);

            if (isChecked.HasValue && isChecked.Value)
            {
                label.AddCssClass("active");
            }
            label.InnerHtml.AppendHtml(input);
            label.InnerHtml.AppendHtml(text);

            // If there are any errors for a named field, we add the CSS attribute.
            if (viewContext.ViewData.ModelState.TryGetValue(name, out var entry) && entry.Errors.Count > 0)
            {
                input.AddCssClass(HtmlHelper.ValidationInputCssClassName);
            }

            AddValidationAttributes(viewContext, input, modelExplorer, expression);

            return(label);
        }
예제 #25
0
        /// <summary>
        /// Generates &lt;input...&gt; element.
        /// </summary>
        /// <param name="viewContext">The view context.</param>
        /// <param name="inputType">The input type.</param>
        /// <param name="fullHtmlFieldName">The full html field name.</param>
        /// <param name="column">The column.</param>
        /// <param name="value">The data value.</param>
        /// <param name="isChecked">Indicates whether this input is checked.</param>
        /// <param name="setId">Indicates whether id should be set.</param>
        /// <param name="isExplicitValue">Indicates whether this value is explicit.</param>
        /// <param name="format">The string format.</param>
        /// <param name="htmlAttributes">The HTML attributes dictionary.</param>
        /// <returns>The tag builder.</returns>
        protected virtual TagBuilder GenerateInput(ViewContext viewContext, InputType inputType,
                                                   string fullHtmlFieldName, Column column,
                                                   object value,
                                                   bool isChecked,
                                                   bool setId,
                                                   bool isExplicitValue,
                                                   string format,
                                                   IDictionary <string, object> htmlAttributes)
        {
            if (viewContext == null)
            {
                throw new ArgumentNullException(nameof(viewContext));
            }

            if (string.IsNullOrEmpty(fullHtmlFieldName))
            {
                throw new ArgumentNullException(nameof(fullHtmlFieldName));
            }

            var inputTypeString = GetInputTypeString(inputType);
            var tagBuilder      = new TagBuilder("input")
            {
                TagRenderMode = TagRenderMode.SelfClosing,
            };

            tagBuilder.MergeAttributes(htmlAttributes);
            tagBuilder.MergeAttribute("type", inputTypeString);
            tagBuilder.MergeAttribute("name", fullHtmlFieldName, replaceExisting: true);

            var suppliedTypeString = tagBuilder.Attributes["type"];

            if (_placeholderInputTypes.Contains(suppliedTypeString))
            {
                AddPlaceholderAttribute(tagBuilder, column);
            }

            if (AllowRenderingMaxLengthAttribute && _maxLengthInputTypes.Contains(suppliedTypeString))
            {
                AddMaxLengthAttribute(tagBuilder, column);
            }

            var valueParameter = FormatValue(value, format ?? string.Empty);
            var usedModelState = false;

            switch (inputType)
            {
            case InputType.CheckBox:
                var modelStateWasChecked = GetModelStateValue(viewContext, fullHtmlFieldName, typeof(bool)) as bool?;
                if (modelStateWasChecked.HasValue)
                {
                    isChecked      = modelStateWasChecked.Value;
                    usedModelState = true;
                }

                goto case InputType.Radio;

            case InputType.Radio:
                if (!usedModelState)
                {
                    if (GetModelStateValue(viewContext, fullHtmlFieldName, typeof(string)) is string modelStateValue)
                    {
                        isChecked      = string.Equals(modelStateValue, valueParameter, StringComparison.Ordinal);
                        usedModelState = true;
                    }
                }

                if (isChecked)
                {
                    tagBuilder.MergeAttribute("checked", "checked");
                }

                tagBuilder.MergeAttribute("value", valueParameter, isExplicitValue);
                break;

            case InputType.Password:
                if (value != null)
                {
                    tagBuilder.MergeAttribute("value", valueParameter, isExplicitValue);
                }

                break;

            case InputType.Text:
            default:
                // The following lines causes problem when valueParameter is a formatted datetime
                // It can be different from the value get from ModelState. To reproduce, remove
                // the [SqlDate] attribute of Movie.ReleaseDate property, then Movies/Edit page
                // will not display ReleaseDate correctly.
                // Not sure the side effect of bypassing GetModelStateValue though.

                /*
                 * var attributeValue = (string)GetModelStateValue(viewContext, fullHtmlFieldName, typeof(string));
                 * if (attributeValue == null)
                 *  attributeValue = valueParameter;
                 */
                var attributeValue = valueParameter;

                var    addValue = true;
                object typeAttributeValue;
                if (htmlAttributes != null && htmlAttributes.TryGetValue("type", out typeAttributeValue))
                {
                    var typeAttributeString = typeAttributeValue.ToString();
                    if (string.Equals(typeAttributeString, "file", StringComparison.OrdinalIgnoreCase) ||
                        string.Equals(typeAttributeString, "image", StringComparison.OrdinalIgnoreCase))
                    {
                        addValue = false;      // 'value' attribute is not needed for 'file' and 'image' input types.
                    }
                }

                if (addValue)
                {
                    tagBuilder.MergeAttribute("value", attributeValue, replaceExisting: isExplicitValue);
                }

                break;
            }

            if (setId)
            {
                NameAndIdProvider.GenerateId(viewContext, tagBuilder, fullHtmlFieldName, IdAttributeDotReplacement);
            }

            // If there are any errors for a named field, we add the CSS attribute.
            if (viewContext.ViewData.ModelState.TryGetValue(fullHtmlFieldName, out var entry) && entry.Errors.Count > 0)
            {
                tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
            }

            AddValidationAttributes(viewContext, tagBuilder, fullHtmlFieldName, column);

            return(tagBuilder);
        }
예제 #26
0
        /// <inheritdoc />
        public virtual TagBuilder GenerateTextArea(
            ViewContext viewContext,
            string fullHtmlFieldName,
            Column column,
            object dataValue,
            int rows,
            int columns,
            object htmlAttributes)
        {
            if (viewContext == null)
            {
                throw new ArgumentNullException(nameof(viewContext));
            }

            if (string.IsNullOrEmpty(fullHtmlFieldName))
            {
                throw new ArgumentNullException(nameof(fullHtmlFieldName));
            }

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

            if (rows < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(rows));
            }

            if (columns < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(columns));
            }

            var value = string.Empty;

            if (dataValue != null)
            {
                value = dataValue.ToString();
            }

            var tagBuilder = new TagBuilder("textarea");

            NameAndIdProvider.GenerateId(viewContext, tagBuilder, fullHtmlFieldName, IdAttributeDotReplacement);
            var htmlAttributeDictionary = GetHtmlAttributeDictionaryOrNull(htmlAttributes);

            tagBuilder.MergeAttributes(htmlAttributeDictionary, replaceExisting: true);
            if (rows > 0)
            {
                tagBuilder.MergeAttribute("rows", rows.ToString(CultureInfo.InvariantCulture), replaceExisting: true);
            }

            if (columns > 0)
            {
                tagBuilder.MergeAttribute("cols", columns.ToString(CultureInfo.InvariantCulture), replaceExisting: true);
            }

            tagBuilder.MergeAttribute("name", fullHtmlFieldName, replaceExisting: true);

            AddPlaceholderAttribute(tagBuilder, column);
            if (AllowRenderingMaxLengthAttribute)
            {
                AddMaxLengthAttribute(tagBuilder, column);
            }

            AddValidationAttributes(viewContext, tagBuilder, fullHtmlFieldName, column);

            viewContext.ViewData.ModelState.TryGetValue(fullHtmlFieldName, out var entry);
            // If there are any errors for a named field, we add this CSS attribute.
            if (entry != null && entry.Errors.Count > 0)
            {
                tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
            }

            // The first newline is always trimmed when a TextArea is rendered, so we add an extra one
            // in case the value being rendered is something like "\r\nHello"
            tagBuilder.InnerHtml.AppendLine();
            tagBuilder.InnerHtml.Append(value);

            return(tagBuilder);
        }