public static IEnumerable <SelectListItem> GetSelectListItems(HtmlHelper html, ISelectListBuilder dropDownList, string expressionText) { string fullHtmlFieldName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expressionText); bool flag = false; IEnumerable <SelectListItem> selectList = dropDownList.SelectList(); bool allowMultiple = dropDownList.Attr("multiple") == "multiple"; if (selectList == null) { selectList = html.GetSelectListItemsFromViewData(expressionText); flag = true; } object defaultValue = allowMultiple ? html.GetModelStateValue(fullHtmlFieldName, typeof(string[])) : html.GetModelStateValue(fullHtmlFieldName, typeof(string)); if (!flag && defaultValue == null && !String.IsNullOrEmpty(expressionText)) { defaultValue = html.ViewData.Eval(expressionText); } if (defaultValue != null) { selectList = GetSelectListWithDefaultValue(selectList, defaultValue, allowMultiple); } return(selectList); }
public void GetModelStateValueReturnsNullIfModelStateKeyNotPresent() { // Arrange ViewDataDictionary vdd = new ViewDataDictionary(); HtmlHelper helper = new HtmlHelper(new ViewContext(), new SimpleViewDataContainer(vdd)); // Act object retVal = helper.GetModelStateValue("key_not_present", typeof(object)); // Assert Assert.IsNull(retVal); }
public void GetModelStateValueReturnsNullIfModelStateHasNoValue() { // Arrange ViewDataDictionary vdd = new ViewDataDictionary(); vdd.ModelState.AddModelError("foo", "some error text"); // didn't call SetModelValue() HtmlHelper helper = new HtmlHelper(new ViewContext(), new SimpleViewDataContainer(vdd)); // Act object retVal = helper.GetModelStateValue("foo", typeof(object)); // Assert Assert.IsNull(retVal); }
public static object GetInputValue(this HtmlHelper html, IFormInputBuilder inputBuilder, string name, object value, bool useViewData = false) { if (inputBuilder.InstanceData.ContainsKey("value")) { return(inputBuilder.Val()); } if (useViewData && value == null) { value = Convert.ToString(html.ViewData.Eval(name), CultureInfo.CurrentCulture); } string fullHtmlFieldName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); object attemptedValue = html.GetModelStateValue(fullHtmlFieldName, typeof(string)); return(attemptedValue ?? value); }
public static MvcHtmlString LowerTextAreaFor <TModel, TProperty>(this HtmlHelper <TModel> html, Expression <Func <TModel, TProperty> > expr) { StringBuilder result = new StringBuilder(); TagBuilder tag = new TagBuilder("textarea"); var lowerPropertyName = ExpressionHelper.GetExpressionText(expr).ToLower(); var name = ExpressionHelper.GetExpressionText(expr); string fullHtmlFieldName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); string propertyValue = (string)html.GetModelStateValue(fullHtmlFieldName, typeof(string)); tag.MergeAttribute("name", lowerPropertyName); tag.MergeAttribute("id", lowerPropertyName); if (!string.IsNullOrEmpty(propertyValue)) { tag.InnerHtml = propertyValue; } result.Append(tag.ToString()); return(new MvcHtmlString(result.ToString())); }
// Helper methods private static MvcHtmlString InputHelper(HtmlHelper htmlHelper, InputType inputType, ModelMetadata metadata, string name, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, IDictionary <string, object> htmlAttributes) { var fullName = name; if (String.IsNullOrEmpty(name)) { throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name"); } var tagBuilder = new TagBuilder("input"); tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("type", HtmlHelper.GetInputTypeString(inputType)); tagBuilder.MergeAttribute("name", fullName, true); string valueParameter = Convert.ToString(value, CultureInfo.CurrentCulture); bool usedModelState = false; switch (inputType) { case InputType.CheckBox: var modelStateWasChecked = htmlHelper.GetModelStateValue(fullName, typeof(bool)) as bool?; if (modelStateWasChecked.HasValue) { isChecked = modelStateWasChecked.Value; usedModelState = true; } goto case InputType.Radio; case InputType.Radio: if (!usedModelState) { var modelStateValue = htmlHelper.GetModelStateValue(fullName, typeof(string)) as string; if (modelStateValue != null) { isChecked = String.Equals(modelStateValue, valueParameter, StringComparison.Ordinal); usedModelState = true; } } if (!usedModelState && useViewData) { isChecked = htmlHelper.EvalBoolean(fullName); } if (isChecked) { tagBuilder.MergeAttribute("checked", "checked"); } tagBuilder.MergeAttribute("value", valueParameter, isExplicitValue); break; case InputType.Password: if (value != null) { tagBuilder.MergeAttribute("value", valueParameter, isExplicitValue); } break; default: var attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string)); tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName) : valueParameter), isExplicitValue); break; } return(tagBuilder.ToMvcHtmlString(TagRenderMode.SelfClosing)); }
static void SelectInternal( HtmlHelper htmlHelper, XcstWriter output, ModelMetadata?metadata, string?optionLabel, string name, IEnumerable <SelectListItem>?selectList, bool allowMultiple, HtmlAttribs?htmlAttributes) { ViewDataDictionary viewData = htmlHelper.ViewData; string fullName = viewData.TemplateInfo.GetFullHtmlFieldName(name); if (String.IsNullOrEmpty(fullName)) { throw new ArgumentNullException(nameof(name)); } bool usedViewData = false; // If we got a null selectList, try to use ViewData to get the list of items. if (selectList is null) { selectList = GetSelectData(htmlHelper, name); usedViewData = true; } object?defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(fullName, typeof(string[])) : htmlHelper.GetModelStateValue(fullName, typeof(string)); // If we haven't already used ViewData to get the entire list of items then we need to // use the ViewData-supplied value before using the parameter-supplied value. if (defaultValue is null) { if (metadata is null) { if (!usedViewData && !String.IsNullOrEmpty(name)) { defaultValue = viewData.Eval(name); } } else { defaultValue = metadata.Model; } } if (defaultValue != null) { selectList = GetSelectListWithDefaultValue(selectList, defaultValue, allowMultiple); } output.WriteStartElement("select"); HtmlAttributeHelper.WriteId(fullName, output); output.WriteAttributeString("name", fullName); HtmlAttributeHelper.WriteBoolean("multiple", allowMultiple, output); // If there are any errors for a named field, we add the css attribute. string?cssClass = (viewData.ModelState.TryGetValue(fullName, out ModelState modelState) && modelState.Errors.Count > 0) ? HtmlHelper.ValidationInputCssClassName : null; var validationAttribs = htmlHelper.GetUnobtrusiveValidationAttributes( name, metadata #if !ASPNETMVC , excludeMinMaxLength: !allowMultiple #endif ); HtmlAttributeHelper.WriteClass(cssClass, htmlAttributes, output); HtmlAttributeHelper.WriteAttributes(validationAttribs, output); // name cannnot be overridden, and class was already written HtmlAttributeHelper.WriteAttributes(htmlAttributes, output, excludeFn: n => n == "name" || n == "class"); WriteOptions(optionLabel, selectList, output); output.WriteEndElement(); // </select> }
private static MvcHtmlString SelectInternal(this HtmlHelper htmlHelper, string optionLabel, string name, IEnumerable <SelectListItem> selectList, bool allowMultiple, IDictionary <string, object> htmlAttributes) { string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); if (String.IsNullOrEmpty(fullName)) { throw new ArgumentException("MvcResources.Common_NullOrEmpty", "name"); } bool usedViewData = false; // If we got a null selectList, try to use ViewData to get the list of items. if (selectList == null) { selectList = htmlHelper.GetSelectData(fullName); usedViewData = true; } object defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(fullName, typeof(string[])) : htmlHelper.GetModelStateValue(fullName, typeof(string)); // If we haven't already used ViewData to get the entire list of items then we need to // use the ViewData-supplied value before using the parameter-supplied value. if (!usedViewData) { if (defaultValue == null) { defaultValue = htmlHelper.ViewData.Eval(fullName); } } if (defaultValue != null) { IEnumerable defaultValues = (allowMultiple) ? defaultValue as IEnumerable : new[] { defaultValue }; IEnumerable <string> values = from object value in defaultValues select Convert.ToString(value, CultureInfo.CurrentCulture); HashSet <string> selectedValues = new HashSet <string>(values, StringComparer.OrdinalIgnoreCase); List <SelectListItem> newSelectList = new List <SelectListItem>(); foreach (SelectListItem item in selectList) { item.Selected = (item.Value != null) ? selectedValues.Contains(item.Value) : selectedValues.Contains(item.Text); newSelectList.Add(item); } selectList = newSelectList; } // Convert each ListItem to an <option> tag StringBuilder listItemBuilder = new StringBuilder(); // Make optionLabel the first item that gets rendered. if (optionLabel != null) { listItemBuilder.AppendLine(ListItemToOption(new SelectListItem() { Text = optionLabel, Value = String.Empty, Selected = false })); } foreach (SelectListItem item in selectList) { listItemBuilder.AppendLine(ListItemToOption(item)); } TagBuilder tagBuilder = new TagBuilder("select") { InnerHtml = listItemBuilder.ToString() }; tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("name", fullName, true /* replaceExisting */); tagBuilder.GenerateId(fullName); if (allowMultiple) { tagBuilder.MergeAttribute("multiple", "multiple"); } // If there are any errors for a named field, we add the css attribute. ModelState modelState; if (htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState)) { if (modelState.Errors.Count > 0) { tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); } } tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name)); return(tagBuilder.ToMvcHtmlString(TagRenderMode.Normal)); }
private static MvcHtmlString SelectInternal(this HtmlHelper htmlHelper, ModelMetadata metadata, string optionLabel, string name, IEnumerable <SelectListItem> selectList, bool allowMultiple, IDictionary <string, object> htmlAttributes) { ModelState modelState; string fullHtmlFieldName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); if (string.IsNullOrEmpty(fullHtmlFieldName)) { throw new ArgumentException("Cannot be null", "name"); } bool flag = false; if (selectList == null) { selectList = htmlHelper.GetSelectData(name); flag = true; } object model = (allowMultiple ? htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof(string[])) : htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof(string))); if (model == null && !string.IsNullOrEmpty(name)) { if (!flag) { model = htmlHelper.ViewData.Eval(name); } else if (metadata != null) { model = metadata.Model; } } if (model != null) { selectList = GetSelectListWithDefaultValue(selectList, model, allowMultiple); } StringBuilder stringBuilder = new StringBuilder(); if (optionLabel != null) { SelectListItem selectListItem = new SelectListItem() { Text = optionLabel, Value = string.Empty, Selected = false }; stringBuilder.AppendLine(ListItemToOption(selectListItem)); } foreach (SelectListItem selectListItem1 in selectList) { stringBuilder.AppendLine(ListItemToOption(selectListItem1)); } TagBuilder tagBuilder = new TagBuilder("select") { InnerHtml = stringBuilder.ToString() }; TagBuilder tagBuilder1 = tagBuilder; tagBuilder1.MergeAttributes <string, object>(htmlAttributes); tagBuilder1.MergeAttribute("name", fullHtmlFieldName, true); tagBuilder1.GenerateId(fullHtmlFieldName); if (allowMultiple) { tagBuilder1.MergeAttribute("multiple", "multiple"); } if (htmlHelper.ViewData.ModelState.TryGetValue(fullHtmlFieldName, out modelState) && modelState.Errors.Count > 0) { tagBuilder1.AddCssClass(HtmlHelper.ValidationInputCssClassName); } tagBuilder1.MergeAttributes <string, object>(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)); return(new MvcHtmlString(tagBuilder1.ToString(TagRenderMode.Normal))); }
internal static MvcHtmlString DropDownbase <VM, TItem, TDisplay, TValue>( this HtmlHelper <VM> htmlHelper, string name, object value, List <ExtendedSelectListItem> items, IDictionary <string, object> htmlAttributes, bool allowsMultipleValues, bool useGroups, ModelMetadata metaData = null) { string partialName = name; if (name == null) { throw new ArgumentNullException("name"); } name = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); if (items == null) { throw new ArgumentNullException("items"); } object defaultValue = (allowsMultipleValues) ? htmlHelper.GetModelStateValue(name, typeof(string[])) : htmlHelper.GetModelStateValue(name, typeof(string)); if (defaultValue == null) { defaultValue = value; } if (defaultValue != null) { IEnumerable defaultValues = (allowsMultipleValues) ? defaultValue as IEnumerable : new[] { defaultValue }; IEnumerable <string> values = (from object currValue in defaultValues select Convert.ToString(currValue, CultureInfo.CurrentCulture)).ToList(); HashSet <string> selectedValues = new HashSet <string>(values, StringComparer.OrdinalIgnoreCase); foreach (ExtendedSelectListItem item in items) { item.Selected = (item.Value != null) ? selectedValues.Contains(item.Value) : selectedValues.Contains(item.Text); } } StringBuilder listItemBuilder = new StringBuilder(); if (useGroups) { foreach (var group in items.GroupBy(i => i.GroupKey)) { var groupProps = group.Select(it => new { Name = it.GroupName, Attrs = it.GroupAttributes }).FirstOrDefault(); IDictionary <string, object> dictionary = groupProps.Attrs as IDictionary <string, object>; if (group.Key != null && groupProps.Name != null) { if (dictionary != null) { listItemBuilder.AppendLine(string.Format("<optgroup label=\"{0}\" value=\"{1}\" {2}>", htmlHelper.Encode(groupProps.Name), htmlHelper.Encode(group.Key), BasicHtmlHelper.GetAttributesString(dictionary))); } else { listItemBuilder.AppendLine(string.Format("<optgroup label=\"{0}\" value=\"{1}\" {2}>", htmlHelper.Encode(groupProps.Name), htmlHelper.Encode(group.Key), BasicHtmlHelper.GetAttributesString(groupProps.Attrs))); } } foreach (ExtendedSelectListItem item in group) { listItemBuilder.AppendLine(ListItemToOption(item)); } if (group.Key != null && groupProps.Name != null) { listItemBuilder.AppendLine("</optgroup>"); } } } else { foreach (ExtendedSelectListItem item in items) { listItemBuilder.AppendLine(ListItemToOption(item)); } } TagBuilder tagBuilder = new TagBuilder("select") { InnerHtml = listItemBuilder.ToString() }; tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("name", name, true /* replaceExisting */); tagBuilder.GenerateId(name); if (allowsMultipleValues) { tagBuilder.MergeAttribute("multiple", "multiple"); } ModelState modelState; if (htmlHelper.ViewData.ModelState.TryGetValue(name, out modelState)) { if (modelState.Errors.Count > 0) { tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); } } tagBuilder.MergeAttributes(MvcEnvironment.GetUnobtrusiveValidation(htmlHelper, partialName, metaData)); return(MvcHtmlString.Create(tagBuilder.ToString())); }
// Helper methods private static MvcHtmlString InputHelper(HtmlHelper htmlHelper, InputType inputType, ModelMetadata metadata, string name, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, string format, IDictionary <string, object> htmlAttributes) { string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); if (String.IsNullOrEmpty(fullName)) { throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name"); } TagBuilder tagBuilder = new TagBuilder("input"); tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("type", HtmlHelper.GetInputTypeString(inputType)); tagBuilder.MergeAttribute("name", fullName, true); string valueParameter = htmlHelper.FormatValue(value, format); bool usedModelState = false; switch (inputType) { case InputType.CheckBox: bool?modelStateWasChecked = htmlHelper.GetModelStateValue(fullName, typeof(bool)) as bool?; if (modelStateWasChecked.HasValue) { isChecked = modelStateWasChecked.Value; usedModelState = true; } goto case InputType.Radio; case InputType.Radio: if (!usedModelState) { string modelStateValue = htmlHelper.GetModelStateValue(fullName, typeof(string)) as string; if (modelStateValue != null) { isChecked = String.Equals(modelStateValue, valueParameter, StringComparison.Ordinal); usedModelState = true; } } if (!usedModelState && useViewData) { isChecked = htmlHelper.EvalBoolean(fullName); } if (isChecked) { tagBuilder.MergeAttribute("checked", "checked"); } tagBuilder.MergeAttribute("value", valueParameter, isExplicitValue); break; case InputType.Password: if (value != null) { tagBuilder.MergeAttribute("value", valueParameter, isExplicitValue); } break; default: string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string)); tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue); break; } if (setId) { tagBuilder.GenerateId(fullName); } // If there are any errors for a named field, we add the css attribute. ModelState modelState; if (htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState)) { if (modelState.Errors.Count > 0) { tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); } } tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)); if (inputType == InputType.CheckBox) { // Render an additional <input type="hidden".../> for checkboxes. This // addresses scenarios where unchecked checkboxes are not sent in the request. // Sending a hidden input makes it possible to know that the checkbox was present // on the page when the request was submitted. StringBuilder inputItemBuilder = new StringBuilder(); inputItemBuilder.Append(tagBuilder.ToString(TagRenderMode.SelfClosing)); TagBuilder hiddenInput = new TagBuilder("input"); hiddenInput.MergeAttribute("type", HtmlHelper.GetInputTypeString(InputType.Hidden)); hiddenInput.MergeAttribute("name", fullName); hiddenInput.MergeAttribute("value", "false"); inputItemBuilder.Append(hiddenInput.ToString(TagRenderMode.SelfClosing)); return(MvcHtmlString.Create(inputItemBuilder.ToString())); } return(tagBuilder.ToMvcHtmlString(TagRenderMode.SelfClosing)); }
public void GetModelStateValueReturnsNullIfModelStateKeyNotPresent() { // Arrange ViewDataDictionary vdd = new ViewDataDictionary(); HtmlHelper helper = new HtmlHelper(new ViewContext(), new SimpleViewDataContainer(vdd)); // Act object retVal = helper.GetModelStateValue("key_not_present", typeof(object)); // Assert Assert.Null(retVal); }
private static MvcHtmlString SelectInternal(this HtmlHelper htmlHelper, ModelMetadata metadata, string optionLabel, string name, IEnumerable <SelectListItem> selectList, bool allowMultiple, IDictionary <string, object> htmlAttributes) { string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); if (String.IsNullOrEmpty(fullName)) { throw new ArgumentException("Name cannot be null or empty"); } bool usedViewData = false; // If we got a null selectList, try to use ViewData to get the list of items. if (selectList == null) { selectList = htmlHelper.GetSelectData(name); usedViewData = true; } object defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(fullName, typeof(string[])) : htmlHelper.GetModelStateValue(fullName, typeof(string)); // If we haven't already used ViewData to get the entire list of items then we need to // use the ViewData-supplied value before using the parameter-supplied value. if (defaultValue == null && !String.IsNullOrEmpty(name)) { if (!usedViewData) { defaultValue = htmlHelper.ViewData.Eval(name); } else if (metadata != null) { defaultValue = metadata.Model; } } if (defaultValue != null) { selectList = GetSelectListWithDefaultValue(selectList, defaultValue, allowMultiple); } // Convert each ListItem to an <option> tag and wrap them with <optgroup> if requested. StringBuilder listItemBuilder = BuildItems(optionLabel, selectList); TagBuilder tagBuilder = new TagBuilder("select") { InnerHtml = listItemBuilder.ToString() }; tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("name", fullName, true /* replaceExisting */); tagBuilder.MergeAttribute("data-width", "100%"); tagBuilder.MergeAttribute("data-live-search", "true"); tagBuilder.MergeAttribute("data-live-search-placeholder", "Search"); tagBuilder.MergeAttribute("data-container", "body"); tagBuilder.MergeAttribute("class", "selectpicker"); tagBuilder.GenerateId(fullName); if (allowMultiple) { tagBuilder.MergeAttribute("multiple", "multiple"); } // If there are any errors for a named field, we add the css attribute. ModelState modelState; if (htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState)) { if (modelState.Errors.Count > 0) { tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); } } tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)); var generateJavascript = GenerateJavascript(); var selectListHtmlString = MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal)); return(MvcHtmlString.Create($"{selectListHtmlString}{generateJavascript}")); }
public static MvcHtmlString AjaxComboBoxFor <TModel, TProperty> (this HtmlHelper <TModel> htmlHelper, Expression <Func <TModel, TProperty> > expression, string formUniqueName, string dataSourceUrl, string captionSrcUrl, IDictionary <string, object> htmlAttributes, object otherJsonAttributes ) { ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); object value = metadata.Model; string valueParameter = Convert.ToString(value, CultureInfo.CurrentCulture); // bool useViewData = false; // string fieldName = ((MemberExpression)expression.Body).Member.Name; string expressionText = ExpressionHelper.GetExpressionText(expression); string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expressionText); /*if (String.IsNullOrEmpty(fullName)) * { * throw new ArgumentException("Null or empty", "name"); * }*/ var tagBuilder = new TagBuilder("span"); tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("id", expressionText.Replace('.', '_')); tagBuilder.MergeAttribute("class", "ac_area"); /*tagBuilder.MergeAttribute("style", * "float: left" + * (tagBuilder.Attributes.ContainsKey("style") ? * ";" + tagBuilder.Attributes["style"] : ""), true);*/ var sb = new StringBuilder(); // HtmlHelper h = htmlHelper; string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string)); // string initVal = attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName); string initVal = attemptedValue ?? valueParameter; //// TODO for ComboBox's hidden //// If there are any errors for a named field, we add the css attribute. ModelState modelState; if (htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState)) { if (modelState.Errors.Count > 0) { tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); } } string html = tagBuilder.ToString(); // tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(fieldName, metadata)); var z = (from y in htmlHelper.GetUnobtrusiveValidationAttributes(expressionText, metadata) select new { KeyValue = "'" + y.Key + "'" + " : " + ("'" + y.Value.ToString() + "'") }) .Select(x => x.KeyValue).ToArray(); string fieldAttributes = ""; if (z.Length > 0) { fieldAttributes = string.Join(" , ", z); } string jsonString; if (otherJsonAttributes != null) { jsonString = new JavaScriptSerializer().Serialize(otherJsonAttributes); jsonString = jsonString.Substring(1, jsonString.Length - 2); } else { jsonString = ""; } sb.Append( string.Format( @" <script type=""text/javascript""> $(function() {{ var n = $('#{0}'{1}).ajaxComboBox('{2}', {{ 'lang' : 'en', 'select_only' : true, 'mini' : true, 'init_src' : '{3}', 'init_val' : ['{4}'] {5} {6} }}); if ($.validator != undefined) $.validator.unobtrusive.parseDynamicContent({7}); }}); </script> " // , expressionText.Replace(".", @"\\.") , expressionText.Replace(".", @"_") , formUniqueName == null ? "" : ", $('#" + formUniqueName + "')" , dataSourceUrl , captionSrcUrl , initVal , z.Length > 0 ? (", " + "other_attr : {" + fieldAttributes + "}") : "" , jsonString.Length > 0 ? ", " + jsonString : "" , formUniqueName == null ? "$('form')" : "$('#'" + formUniqueName + "')" ) ); // return new MvcHtmlString(html + @"<span style=""float: left; margin-top: 0px""></span>" + " " + sb.ToString()); return(new MvcHtmlString(html + sb.ToString())); // return new MvcHtmlString(tagBuilder.ToString()); }
private static MvcHtmlString SelectInternal(this HtmlHelper htmlHelper, string optionLabel, string name, IEnumerable <GroupedSelectListItem> selectList, bool allowMultiple, IDictionary <string, object> htmlAttributes) { name = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); if (string.IsNullOrEmpty(name)) { throw new ArgumentException("Null Or Empty", nameof(name)); } var flag1 = false; if (selectList == null) { selectList = htmlHelper.GetSelectData(name); flag1 = true; } var obj = allowMultiple ? htmlHelper.GetModelStateValue(name, typeof(string[])) : htmlHelper.GetModelStateValue(name, typeof(string)); if (!flag1 && obj == null) { obj = htmlHelper.ViewData.Eval(name); } if (obj != null) { IEnumerable source; if (!allowMultiple) { source = new object[1] { obj } } ; else { source = obj as IEnumerable; } var hashSet = new HashSet <string>(source.Cast <object>().Select(value => Convert.ToString(value, CultureInfo.CurrentCulture)), StringComparer.OrdinalIgnoreCase); var list = new List <GroupedSelectListItem>(); foreach (var groupedSelectListItem in selectList) { groupedSelectListItem.Selected = groupedSelectListItem.Value != null?hashSet.Contains(groupedSelectListItem.Value) : hashSet.Contains(groupedSelectListItem.Text); list.Add(groupedSelectListItem); } selectList = list; } var stringBuilder1 = new StringBuilder(); if (optionLabel != null) { var stringBuilder2 = stringBuilder1; var groupedSelectListItem = new GroupedSelectListItem { Text = optionLabel, Value = string.Empty, Selected = false }; var str = ListItemToOption(groupedSelectListItem); stringBuilder2.AppendLine(str); } using (var enumerator = selectList.GroupBy(i => i.GroupKey).GetEnumerator()) { while (enumerator.MoveNext()) { var group = enumerator.Current; var str = selectList.Where(i => i.GroupKey == @group.Key).Select(it => it.GroupName).FirstOrDefault(); var flag2 = selectList.Where(i => i.GroupKey == @group.Key).Select(it => it.Disabled).FirstOrDefault(); stringBuilder1.AppendLine(string.Format(@"<optgroup label=""{0}"" value=""{1}"" {2}>", str, @group.Key, flag2 ? "disabled" : "")); foreach (var groupedSelectListItem in @group) { stringBuilder1.AppendLine(ListItemToOption(groupedSelectListItem)); } stringBuilder1.AppendLine("</optgroup>"); } } var tagBuilder = new TagBuilder("select") { InnerHtml = stringBuilder1.ToString() }; tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("name", name, true); tagBuilder.GenerateId(name); if (allowMultiple) { tagBuilder.MergeAttribute("multiple", "multiple"); } ModelState modelState; if (htmlHelper.ViewData.ModelState.TryGetValue(name, out modelState) && modelState.Errors.Count > 0) { tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); } return(MvcHtmlString.Create(tagBuilder.ToString())); }
private static MvcHtmlString BsMixedButtonGroupDropdownInternal <TKey>(this HtmlHelper htmlHelper, string name, BsSelectList <TKey> selectList, string optionLabel, IDictionary <string, object> htmlAttributes, string bsCssClass, ModelMetadata metadata = null) { name += ".SelectedValues"; name = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); bool usedViewData = false; object defaultValue = htmlHelper.GetModelStateValue(name, typeof(string)); // If we haven't already used ViewData to get the entire list of items then we need to // use the ViewData-supplied value before using the parameter-supplied value. if (!usedViewData) { if (defaultValue == null) { defaultValue = htmlHelper.ViewData.Eval(name); } } if (defaultValue != null) { var defaultValues = new[] { defaultValue }; var values = from object value in defaultValues select Convert.ToString(value, CultureInfo.CurrentCulture); var selectedValues = new HashSet <string>(values, StringComparer.OrdinalIgnoreCase); var newSelectList = new BsSelectList <TKey> { SelectedValues = selectList.SelectedValues }; foreach (var item in selectList.Items) { item.Selected = (item.Value != null) ? selectedValues.Contains(item.Value) : selectedValues.Contains(item.Text); newSelectList.Items.Add(item); } selectList = newSelectList; } var listItemBuilder = new StringBuilder(); // Make optionLabel the first item that gets rendered. if (optionLabel != null) { listItemBuilder.AppendLine( ListItemToOption(new BsSelectListItem { Text = optionLabel, Value = String.Empty, Selected = false })); } //build options foreach (var item in selectList.Items) { listItemBuilder.AppendLine(ListItemToOption(item)); } var tagBuilder = new TagBuilder("select") { InnerHtml = listItemBuilder.ToString() }; tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("name", name, true); tagBuilder.AddCssClass(bsCssClass); tagBuilder.AddCssClass("form-control"); tagBuilder.GenerateId(name); tagBuilder.BsSelectListValidation(htmlHelper, name, metadata); tagBuilder.MergeAttribute("style", "display:none"); #region render button dropdown var buttonGroupContainer = new TagBuilder("div"); buttonGroupContainer.AddCssClass("checkbox_replace bs-mixedButtonGroupDropdownContainer form-control"); buttonGroupContainer.MergeAttribute("tabindex", 0.ToString()); var btnGroup = new TagBuilder("div"); btnGroup.AddCssClass("btn-group-justified bs-buttonsContainer"); #region render buttons first foreach (var item in selectList.Items.Where(x => x.IsButton)) { var buttonA = new TagBuilder("a"); buttonA.AddCssClass("option bs-buttonGroupItem"); buttonA.MergeAttribute("data-value", item.Value); if (item.Selected) { buttonA.AddCssClass("selected"); } buttonA.InnerHtml += HttpUtility.HtmlEncode(item.Text); btnGroup.InnerHtml += buttonA; } #endregion if (selectList.Items.Any(x => !x.IsButton)) { var button = new TagBuilder("a"); button.AddCssClass("option dropdown-toggle bs-buttonGroupDropdownToggle"); button.MergeAttribute("href", "#"); button.MergeAttribute("data-toggle", "dropdown"); button.MergeAttribute("data-dropdown-for", tagBuilder.Attributes["id"]); if (optionLabel != null) { button.MergeAttribute("data-placeholder", optionLabel + " "); } else { optionLabel = selectList.Items.FirstOrDefault(x => !x.IsButton).Text; button.MergeAttribute("data-placeholder", optionLabel + " "); } var selectedValue = selectList.Items.Where(x => !x.IsButton).FirstOrDefault(x => x.Selected); if (selectedValue != null) { button.InnerHtml += selectedValue.Text + " "; button.AddCssClass("selected"); } else { button.InnerHtml += optionLabel + " "; } var carretSpan = new TagBuilder("span"); carretSpan.AddCssClass("caret"); button.InnerHtml += carretSpan.ToString(); btnGroup.InnerHtml += button; var dropdownUl = new TagBuilder("ul"); dropdownUl.AddCssClass("dropdown-menu dropdown-menu-right bs-dropdownList"); dropdownUl.MergeAttribute("role", "menu"); var dropdownListItemBuilder = new StringBuilder(); foreach (var item in selectList.Items.Where(x => !x.IsButton)) { dropdownListItemBuilder.AppendLine(ListItemToLi(item)); } dropdownUl.InnerHtml += dropdownListItemBuilder.ToString(); buttonGroupContainer.InnerHtml += btnGroup; buttonGroupContainer.InnerHtml += dropdownUl; } else { buttonGroupContainer.InnerHtml += btnGroup; } #endregion return(MvcHtmlString.Create(tagBuilder.ToString() + buttonGroupContainer.ToString())); }
private static MvcHtmlString BsTagListInternal <TKey>(this HtmlHelper htmlHelper, string name, BsSelectList <TKey> selectList, string optionLabel, IDictionary <string, object> htmlAttributes, string bsCssClass, ModelMetadata metadata = null) { //TODO: refactoring //bind the selected values BsSelectList.SelectedValues name += ".SelectedValues"; name = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); if (String.IsNullOrEmpty(name)) { throw new ArgumentException("Null Or Empty", "name"); } bool usedViewData = false; // If we got a null selectList, try to use ViewData to get the list of items. if (selectList == null) { selectList = htmlHelper.GetSelectData <TKey>(name); usedViewData = true; } bool allowMultiple = true; object defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(name, typeof(string[])) : htmlHelper.GetModelStateValue(name, typeof(string)); // If we haven't already used ViewData to get the entire list of items then we need to // use the ViewData-supplied value before using the parameter-supplied value. if (!usedViewData) { if (defaultValue == null) { defaultValue = htmlHelper.ViewData.Eval(name); } } if (defaultValue != null) { var defaultValues = (allowMultiple) ? defaultValue as IEnumerable : new[] { defaultValue }; var values = from object value in defaultValues select Convert.ToString(value, CultureInfo.CurrentCulture); var selectedValues = new HashSet <string>(values, StringComparer.OrdinalIgnoreCase); var newSelectList = new BsSelectList <TKey> { SelectedValues = selectList.SelectedValues }; foreach (var item in selectList.Items) { item.Selected = (item.Value != null) ? selectedValues.Contains(item.Value) : selectedValues.Contains(item.Text); newSelectList.Items.Add(item); } selectList = newSelectList; } // Convert each ListItem to an <option> tag var listItemBuilder = new StringBuilder(); // Make optionLabel the first item that gets rendered. if (optionLabel != null) { listItemBuilder.AppendLine( ListItemToOption(new BsSelectListItem { Text = optionLabel, Value = String.Empty, Selected = false })); } //build options foreach (var item in selectList.Items) { listItemBuilder.AppendLine(ListItemToOption(item)); } var tagBuilder = new TagBuilder("select") { InnerHtml = listItemBuilder.ToString() }; tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("name", name, true); tagBuilder.AddCssClass(bsCssClass); tagBuilder.AddCssClass("form-control"); tagBuilder.GenerateId(name); if (allowMultiple) { tagBuilder.MergeAttribute("multiple", "multiple"); } tagBuilder.BsSelectListValidation(htmlHelper, name, metadata); return(MvcHtmlString.Create(tagBuilder.ToString())); }
private static MvcHtmlString SelectInternal(this HtmlHelper htmlHelper, string optionLabel, string name, IEnumerable <ExtendedSelectListItem> selectList, bool allowMultiple, IDictionary <string, object> htmlAttributes) { string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); if (String.IsNullOrEmpty(fullName)) { throw new ArgumentException("no name"); } bool usedViewData = false; // If we got a null selectList, try to use ViewData to get the list of items. if (selectList == null) { selectList = (IEnumerable <ExtendedSelectListItem>)GetSelectData(htmlHelper, name); usedViewData = true; } object defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(fullName, typeof(string[])) : htmlHelper.GetModelStateValue(fullName, typeof(string)); // If we haven't already used ViewData to get the entire list of items then we need to // use the ViewData-supplied value before using the parameter-supplied value. if (defaultValue == null && !String.IsNullOrEmpty(name)) { if (!usedViewData) { defaultValue = htmlHelper.ViewData.Eval(name); } } // Convert each ListItem to an <option> tag StringBuilder listItemBuilder = new StringBuilder(); // Make optionLabel the first item that gets rendered. if (optionLabel != null) { listItemBuilder.Append(ListItemToOption(new ExtendedSelectListItem() { Text = optionLabel, Value = string.Empty, Selected = false })); } foreach (ExtendedSelectListItem item in selectList) { if (defaultValue != null) { listItemBuilder.Append(ListItemToOption(item)); } } TagBuilder tagBuilder = new TagBuilder("select") { InnerHtml = listItemBuilder.ToString() }; tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("name", fullName, true /* replaceExisting */); tagBuilder.GenerateId(fullName); if (allowMultiple) { tagBuilder.MergeAttribute("multiple", "multiple"); } // If there are any errors for a named field, we add the css attribute. ModelState modelState; if (htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState)) { if (modelState.Errors.Count > 0) { tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); } } tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name)); return(MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal))); }
public void GetModelStateValueReturnsNullIfModelStateHasNoValue() { // Arrange ViewDataDictionary vdd = new ViewDataDictionary(); vdd.ModelState.AddModelError("foo", "some error text"); // didn't call SetModelValue() HtmlHelper helper = new HtmlHelper(new ViewContext(), new SimpleViewDataContainer(vdd)); // Act object retVal = helper.GetModelStateValue("foo", typeof(object)); // Assert Assert.Null(retVal); }
private static MvcHtmlString MakeCheckbox(HtmlHelper htmlHelper, InputType inputType, ModelMetadata metadata, string name, bool useViewData, bool isChecked, IDictionary <string, object> htmlAttributes) { string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); var tagBuilder = new TagBuilder("input"); tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("type", HtmlHelper.GetInputTypeString(inputType)); tagBuilder.MergeAttribute("name", fullName, true); string valueParameter = Convert.ToString("true", CultureInfo.CurrentCulture); bool usedModelState = false; var modelStateWasChecked = htmlHelper.GetModelStateValue(fullName, typeof(bool)) as bool?; if (modelStateWasChecked.HasValue) { isChecked = modelStateWasChecked.Value; usedModelState = true; } if (!usedModelState) { var modelStateValue = htmlHelper.GetModelStateValue(fullName, typeof(string)) as string; if (modelStateValue != null) { isChecked = String.Equals(modelStateValue, valueParameter, StringComparison.Ordinal); usedModelState = true; } } if (!usedModelState && useViewData) { isChecked = htmlHelper.EvalBoolean(fullName); } if (isChecked) { tagBuilder.MergeAttribute("checked", "checked"); } tagBuilder.MergeAttribute("value", valueParameter, false); tagBuilder.GenerateId(fullName); // If there are any errors for a named field, we add the css attribute. ModelState modelState; if (htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState)) { if (modelState.Errors.Count > 0) { tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); } } tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)); if (inputType == InputType.CheckBox) { // Render an additional <input type="hidden".../> for checkboxes. This // addresses scenarios where unchecked checkboxes are not sent in the request. // Sending a hidden input makes it possible to know that the checkbox was present // on the page when the request was submitted. var inputItemBuilder = new StringBuilder(); inputItemBuilder.Append(tagBuilder.ToString(TagRenderMode.SelfClosing)); var hiddenInput = new TagBuilder("input"); hiddenInput.MergeAttribute("type", HtmlHelper.GetInputTypeString(InputType.Hidden)); hiddenInput.MergeAttribute("name", fullName); hiddenInput.MergeAttribute("value", "false"); inputItemBuilder.Append(hiddenInput.ToString(TagRenderMode.SelfClosing)); return(MvcHtmlString.Create(inputItemBuilder.ToString())); } return(tagBuilder.ToMvcHtmlString(TagRenderMode.SelfClosing)); }
private static MvcHtmlString SelectInternal(this HtmlHelper htmlHelper, string optionLabel, string name, IEnumerable <GroupedSelectListItem> selectList, bool allowMultiple, IDictionary <string, object> htmlAttributes) { name = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); if (String.IsNullOrEmpty(name)) { throw new ArgumentException("Null Or Empty", "name"); } bool usedViewData = false; // If we got a null selectList, try to use ViewData to get the list of items. if (selectList == null) { selectList = htmlHelper.GetSelectData(name); usedViewData = true; } object defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(name, typeof(string[])) : htmlHelper.GetModelStateValue(name, typeof(string)); // If we haven't already used ViewData to get the entire list of items then we need to // use the ViewData-supplied value before using the parameter-supplied value. if (!usedViewData) { if (defaultValue == null) { defaultValue = htmlHelper.ViewData.Eval(name); } } if (defaultValue != null) { var defaultValues = (allowMultiple) ? defaultValue as IEnumerable : new[] { defaultValue }; var values = from object value in defaultValues select Convert.ToString(value, CultureInfo.CurrentCulture); var selectedValues = new HashSet <string>(values, StringComparer.OrdinalIgnoreCase); var newSelectList = new List <GroupedSelectListItem>(); foreach (var item in selectList) { //item.Selected = (item.Value != null) ? selectedValues.Contains(item.Value) : selectedValues.Contains(item.Text); newSelectList.Add(item); } selectList = newSelectList; } // Convert each ListItem to an <option> tag var listItemBuilder = new StringBuilder(); // Make optionLabel the first item that gets rendered. if (optionLabel != null) { listItemBuilder.AppendLine(ListItemToOption(new GroupedSelectListItem { Text = optionLabel, Value = String.Empty, Selected = false })); } foreach (var group in selectList.GroupBy(i => i.GroupKey)) { string groupName = selectList.Where(i => i.GroupKey == group.Key).Select(it => it.GroupName).FirstOrDefault(); listItemBuilder.AppendLine(string.Format("<optgroup label=\"{0}\" value=\"{1}\">", groupName, group.Key)); foreach (GroupedSelectListItem item in group) { listItemBuilder.AppendLine(ListItemToOption(item)); } listItemBuilder.AppendLine("</optgroup>"); } var tagBuilder = new TagBuilder("select") { InnerHtml = listItemBuilder.ToString() }; tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("name", name, true /* replaceExisting */); tagBuilder.GenerateId(name); if (allowMultiple) { tagBuilder.MergeAttribute("multiple", "multiple"); } // If there are any errors for a named field, we add the css attribute. ModelState modelState; if (htmlHelper.ViewData.ModelState.TryGetValue(name, out modelState)) { if (modelState.Errors.Count > 0) { tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); } } return(MvcHtmlString.Create(tagBuilder.ToString())); }
internal static MvcHtmlString CustomDropDownListFor(this HtmlHelper htmlHelper, ModelMetadata metadata, string optionLabel, string name, IEnumerable <CustomSelectListItem> selectList, IDictionary <string, object> htmlAttributes) { var fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); if (string.IsNullOrEmpty(fullName)) { throw new ArgumentException("No name"); } if (selectList == null) { throw new ArgumentException("No selectlist"); } var defaultValue = htmlHelper.GetModelStateValue(fullName, typeof(string)); // If we haven't already used ViewData to get the entire list of items then we need to // use the ViewData-supplied value before using the parameter-supplied value. if (defaultValue == null) { defaultValue = htmlHelper.ViewData.Eval(fullName); } if (defaultValue != null) { var defaultValues = new[] { defaultValue }; var values = from object value in defaultValues select Convert.ToString(value, CultureInfo.CurrentCulture); var selectedValues = new HashSet <string>(values, StringComparer.OrdinalIgnoreCase); var newSelectList = new List <CustomSelectListItem>(); foreach (var item in selectList) { item.Selected = (item.Value != null) ? selectedValues.Contains(item.Value) : selectedValues.Contains(item.Text); newSelectList.Add(item); } selectList = newSelectList; } // Convert each ListItem to an <option> tag var listItemBuilder = new StringBuilder(); // Make optionLabel the first item that gets rendered. if (optionLabel != null) { listItemBuilder.Append( ListItemToOption(new CustomSelectListItem { Text = optionLabel, Value = string.Empty, Selected = false })); } foreach (var item in selectList) { listItemBuilder.Append(ListItemToOption(item)); } var tagBuilder = new TagBuilder("select") { InnerHtml = listItemBuilder.ToString() }; tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("name", fullName, true /* replaceExisting */); tagBuilder.GenerateId(fullName); // If there are any errors for a named field, we add the css attribute. ModelState modelState; if (htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState)) { if (modelState.Errors.Count > 0) { tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); } } tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(fullName, metadata)); return(MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal))); }