public override void Process(TagHelperContext context, TagHelperOutput output) { Guard.ArgumentNotNull(context, nameof(context)); Guard.ArgumentNotNull(output, nameof(output)); string fullName = NameAndIdProvider.GetFullHtmlFieldName(ViewContext, For.Name); string elementId = NameAndIdProvider.CreateSanitizedId(ViewContext, fullName, TagHelperConstants.ValidationAnchorSeparator); if (string.IsNullOrWhiteSpace(elementId)) { throw new InvalidOperationException("Unable to determine form ID string"); } output.Attributes.Add("name", $"{TagHelperConstants.ValidationAnchorPrefix}-{elementId}"); output.Attributes.Add("class", "form-anchor"); }
public virtual TagBuilder GenerateSelect( ViewContext viewContext, ModelExplorer modelExplorer, string optionLabel, string expression, IEnumerable <GdsSelectListItem> selectList, ICollection <string> currentValues, bool allowMultiple, object htmlAttributes) { if (viewContext == null) { throw new ArgumentNullException(nameof(viewContext)); } var fullName = NameAndIdProvider.GetFullHtmlFieldName(viewContext, expression); var htmlAttributeDictionary = GetHtmlAttributeDictionaryOrNull(htmlAttributes); if (!IsFullNameValid(fullName, htmlAttributeDictionary)) { throw new ArgumentNullException("FormatHtmlGenerator_FieldNameCannotBeNullOrEmpty", nameof(expression)); ////throw new ArgumentException( //// Resources.FormatHtmlGenerator_FieldNameCannotBeNullOrEmpty( //// typeof(IHtmlHelper).FullName, //// nameof(IHtmlHelper.Editor), //// typeof(IHtmlHelper<>).FullName, //// nameof(IHtmlHelper<object>.EditorFor), //// "htmlFieldName"), //// nameof(expression)); } // If we got a null selectList, try to use ViewData to get the list of items. if (selectList == null) { selectList = GetSelectListItems(viewContext, expression); } modelExplorer = modelExplorer ?? ExpressionMetadataProvider.FromStringExpression(expression, viewContext.ViewData, _metadataProvider); // 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, fullName, IdAttributeDotReplacement); if (!string.IsNullOrEmpty(fullName)) { tagBuilder.MergeAttribute("name", fullName, 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(fullName, out var entry)) { if (entry.Errors.Count > 0) { tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); } } AddValidationAttributes(viewContext, tagBuilder, modelExplorer, expression); return(tagBuilder); }