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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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()));
        }
Example #6
0
        // 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));
        }
Example #7
0
        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>
        }
Example #8
0
        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));
        }
Example #9
0
        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)));
        }
Example #10
0
        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));
        }
Example #12
0
        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());
        }
Example #15
0
        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()));
        }
Example #16
0
        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()));
        }
Example #17
0
        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)));
        }
Example #19
0
        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);
        }
Example #20
0
        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));
        }
Example #21
0
    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()));
    }
Example #22
0
        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)));
        }