/// <summary> /// Create a label with the required field asterix /// </summary> /// <typeparam name="TModel">Type to be scanned</typeparam> /// <typeparam name="TValue">Property to be scanned</typeparam> /// <param name="html">Htmlhelper extension</param> /// <param name="expression">The property lamba expression</param> /// <param name="labelText">Label text to be shown</param> /// <param name="htmlAttributes">[Optional] Extra html attributes</param> /// <returns>A label with the required field asterix</returns> public static IExtendedHtmlString RequiredFieldLabelFor <TModel, TValue>(this HtmlHelpers <TModel> html, Expression <Func <TModel, TValue> > expression, string labelText, object htmlAttributes = null) { if (expression == null) { throw new ArgumentNullException("expression"); } MemberExpression exp = expression.Body as MemberExpression; if (exp == null) { throw new ArgumentException("Unable to parse property lambda expression", "expression"); } HtmlComponent label = new HtmlComponent(EHtmlTag.Label, htmlAttributes); label.Attributes["id"] = WebExtrasUtil.GetFieldIdFromExpression(exp); label.Attributes["name"] = WebExtrasUtil.GetFieldNameFromExpression(exp); label.InnerHtml = labelText; if (exp.Member.GetCustomAttributes(typeof(RequiredAttribute), true).Any()) { HtmlComponent span = new HtmlComponent(EHtmlTag.Span); span.CssClasses.Add("required"); span.InnerHtml = " *"; label.AppendTags.Add(span); } return(new ExtendedHtmlString(label)); }
/// <summary> /// Create bootstrap 3 tags /// </summary> /// <param name="htmlAttributes">Extra HTML attributes</param> private void CreateBootstrap3Tags(object htmlAttributes) { var defaultAttribs = new Dictionary <string, string> { { "type", "text" }, { "id", WebExtrasUtil.GetFieldIdFromExpression(m_propertyExpression) }, { "name", WebExtrasUtil.GetFieldNameFromExpression(m_propertyExpression) } }; DataTypeAttribute[] customAttribs = (DataTypeAttribute[])m_propertyExpression.Member.GetCustomAttributes(typeof(DataTypeAttribute), false); if (customAttribs.Length > 0) { switch (customAttribs[0].DataType) { case DataType.EmailAddress: defaultAttribs["type"] = "email"; break; case DataType.Password: defaultAttribs["type"] = "password"; break; case DataType.MultilineText: defaultAttribs["type"] = "textarea"; break; } } Dictionary <string, string> attribs = WebExtrasUtil .AnonymousObjectToHtmlAttributes(htmlAttributes) .ToDictionary() .Merge(defaultAttribs) .ToDictionary(k => k.Key, v => v.Value); HtmlComponent input; if (m_selectListItems != null) { input = new HtmlSelect(m_selectListItems, attribs); } else if (m_textAreaDimensions != null || attribs.ContainsValue("textarea")) { attribs.Remove("type"); input = new HtmlComponent(EHtmlTag.TextArea, attribs); } else { input = new HtmlComponent(EHtmlTag.Input, attribs); } input.CssClasses.Add("form-control"); Input = input; InputGroup = new HtmlComponent(EHtmlTag.Div); InputGroup.CssClasses.Add("input-group"); InputGroup.AppendTags.Add(input); }
/// <summary> /// Creates a Bootstrap date time picker control /// </summary> /// <typeparam name="TModel">Type to be scanned</typeparam> /// <typeparam name="TValue">Property to be scanned</typeparam> /// <param name="html">HtmlHelper extension</param> /// <param name="expression">The property lamba expression</param> /// <param name="options">Date time picker options</param> /// <param name="htmlAttributes">Extra HTML attributes to be applied to the text box</param> /// <returns>A Bootstrap date time picker control</returns> public static IExtendedHtmlString DateTimeTextBoxFor <TModel, TValue>(this HtmlHelpers <TModel> html, Expression <Func <TModel, TValue> > expression, PickerOptions options, object htmlAttributes) { MemberExpression mex = expression.Body as MemberExpression; string id = WebExtrasUtil.GetFieldIdFromExpression(mex); string name = WebExtrasUtil.GetFieldNameFromExpression(mex); IHtmlComponent control = new DateTimePickerHtmlComponent(name, id, options, htmlAttributes); return(new ExtendedHtmlString(control)); }
/// <summary> /// Creates a Bootstrap date time picker control /// </summary> /// <typeparam name="TModel">Type to be scanned</typeparam> /// <typeparam name="TValue">Property to be scanned</typeparam> /// <param name="html">HtmlHelper extension</param> /// <param name="expression">The property lamba expression</param> /// <param name="options">Date time picker options</param> /// <param name="htmlAttributes">Extra HTML attributes to be applied to the text box</param> /// <returns>A Bootstrap date time picker control</returns> public static IExtendedHtmlStringLegacy DateTimeTextBoxFor <TModel, TValue>(this HtmlHelper <TModel> html, Expression <Func <TModel, TValue> > expression, PickerOptions options, object htmlAttributes = (IDictionary <string, object>) null) { MemberExpression exp = expression.Body as MemberExpression; PickerOptions pickerOptions = options.GetHashCode() == BootstrapSettings.DateTimePickerOptions.GetHashCode() ? options.DeepClone() : options; pickerOptions = pickerOptions.TryFontAwesomeIcons(); var model = ((DateTime?)ModelMetadata.FromLambdaExpression(expression, html.ViewData).Model); if (model.HasValue && model.Value > DateTime.MinValue) { pickerOptions.defaultDate = model; } string fieldId = WebExtrasUtil.GetFieldIdFromExpression(exp); string fieldName = WebExtrasUtil.GetFieldNameFromExpression(exp); // create the text box HtmlComponent input = new HtmlComponent(EHtmlTag.Input); var attribs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes) .ToDictionary(k => k.Key, v => v.Value.ToString()); input.Attributes.Add(attribs); input.Attributes["type"] = "text"; input.Attributes["name"] = fieldName; if (input.Attributes.ContainsKey("class")) { input.Attributes["class"] += " form-control"; } else { input.Attributes["class"] = "form-control"; } // create icon HtmlComponent icon = new HtmlComponent(EHtmlTag.I); if (WebExtrasSettings.FontAwesomeVersion == EFontAwesomeVersion.V4) { icon.CssClasses.Add("fa fa-calendar"); } else if (WebExtrasSettings.FontAwesomeVersion == EFontAwesomeVersion.V3) { icon.CssClasses.Add("icon-calendar"); } else { icon.CssClasses.Add("glyphicon glyphicon-calendar"); } // create addon HtmlComponent addOn = new HtmlComponent(EHtmlTag.Span); addOn.CssClasses.Add("input-group-addon"); addOn.AppendTags.Add(icon); // create JSON dictionary of the picker options string op = pickerOptions.ToJson(new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); HtmlComponent script = new HtmlComponent(EHtmlTag.Script); script.Attributes["type"] = "text/javascript"; script.InnerHtml = "$(function(){ $('#" + fieldId + "').datetimepicker(" + op + "); });"; // create the final component IHtmlComponent control; if (pickerOptions.useAddonField.Equals(false)) { NullWrapperComponent wrapper = new NullWrapperComponent(); input.Attributes["id"] = fieldId; wrapper.Components.Add(input); wrapper.Components.Add(script); control = wrapper; } else { control = new HtmlComponent(EHtmlTag.Div); control.Attributes["id"] = fieldId; control.Attributes["class"] = "input-group date"; control.AppendTags.Add(input); control.AppendTags.Add(addOn); control.AppendTags.Add(script); } return(new HtmlElement(control)); }
/// <summary> /// Creates a Bootstrap date time picker control /// </summary> /// <typeparam name="TModel">Type to be scanned</typeparam> /// <typeparam name="TValue">Property to be scanned</typeparam> /// <param name="html">HtmlHelper extension</param> /// <param name="expression">The property lamba expression</param> /// <param name="options">Date time picker options</param> /// <param name="htmlAttributes">Extra HTML attributes to be applied to the text box</param> /// <returns>A Bootstrap date time picker control</returns> public static MvcHtmlString DateTimeTextBoxFor <TModel, TValue>(this HtmlHelper <TModel> html, Expression <Func <TModel, TValue> > expression, PickerOptions options, object htmlAttributes = (IDictionary <string, object>) null) { MemberExpression exp = expression.Body as MemberExpression; PickerOptions pickerOptions = options.GetHashCode() == BootstrapSettings.DateTimePickerOptions.GetHashCode() ? options.DeepClone() : options; pickerOptions = pickerOptions.UpdateOptionsBasedOnView(); string fieldId = WebExtrasUtil.GetFieldIdFromExpression(exp); string fieldName = WebExtrasUtil.GetFieldNameFromExpression(exp); string datetimeformat = ConvertToCsDateFormat(pickerOptions.format); // create the text box TagBuilder input = new TagBuilder("input"); input.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); input.Attributes["type"] = "text"; input.Attributes["value"] = ((DateTime)ModelMetadata.FromLambdaExpression(expression, html.ViewData).Model).ToString(datetimeformat); input.Attributes["name"] = fieldName; if (input.Attributes.ContainsKey("class")) { input.Attributes["class"] += " form-control"; } else { input.Attributes["class"] = "form-control"; } // create addon TagBuilder addOn = new TagBuilder("span"); addOn.AddCssClass("add-on"); TagBuilder icons = new TagBuilder("i"); icons.AddCssClass("icon-calendar"); TagBuilder control = new TagBuilder("div"); control.Attributes["id"] = fieldId; control.Attributes["class"] = "input-append date form_datetime"; addOn.InnerHtml = icons.ToString(TagRenderMode.Normal); control.InnerHtml = input.ToString(TagRenderMode.SelfClosing) + addOn.ToString(TagRenderMode.Normal); // create JSON dictionary of the picker options string op = pickerOptions.ToJson(); TagBuilder script = new TagBuilder("script"); script.Attributes["type"] = "text/javascript"; script.InnerHtml = "$(function(){ $('#" + fieldId + "').datetimepicker(" + op + "); });"; return(MvcHtmlString.Create(control.ToString(TagRenderMode.Normal) + script.ToString(TagRenderMode.Normal))); }