/// <summary> /// Builds a checkbox that allows multiple rows in a table to be /// selected /// </summary> public static MvcHtmlString RowCheckboxFor <TModel>(this HtmlHelper <TModel> helper, Expression <Func <TModel, long> > idProperty, dynamic htmlAttributes = null) { if (idProperty.NodeType != ExpressionType.Lambda || idProperty.Body.NodeType != ExpressionType.MemberAccess) { throw new ArgumentException(nameof(idProperty)); } var value = idProperty.Compile()(helper.ViewData.Model).ToString(); var inputTag = new TagBuilder("input"); inputTag.MergeAttribute("name", "ids"); inputTag.MergeAttribute("type", "checkbox"); inputTag.MergeAttribute("value", value); inputTag.MergeAttribute("id", string.Format("id{0}", controlId++)); IDictionary <string, string> properties = TagBuilderExtensions.DynamicToProperties(htmlAttributes); inputTag.AddCustomHtmlAttributes(properties); return(MvcHtmlString.Create(inputTag.ToString())); }
public static MvcHtmlString MultiSelectTextBoxFor <TModel, TProp>( this HtmlHelper <TModel> helper, Expression <Func <TModel, UpdatableField <TProp> > > updatableField, dynamic htmlAttributes = null) { if (updatableField.NodeType != ExpressionType.Lambda || updatableField.Body.NodeType != ExpressionType.MemberAccess) { throw new ArgumentException(nameof(updatableField)); } var node = updatableField.Body as MemberExpression; var fieldName = node.Member.Name; var fieldValue = updatableField.Compile()(helper.ViewData.Model); var indeterminateFlagElement = new TagBuilder("input"); indeterminateFlagElement.MergeAttribute("name", string.Format("{0}_IsIndeterminate", fieldName)); indeterminateFlagElement.MergeAttribute("type", "hidden"); indeterminateFlagElement.MergeAttribute("class", "kaia-ms-flag"); indeterminateFlagElement.MergeAttribute("value", fieldValue.IsIndeterminate.ToString()); var oldValueElement = new TagBuilder("input"); oldValueElement.MergeAttribute("name", string.Format("{0}_OldValue", fieldName)); oldValueElement.MergeAttribute("type", "hidden"); oldValueElement.MergeAttribute("class", "kaia-ms-old"); if (fieldValue.IsIndeterminate) { oldValueElement.MergeAttribute("value", MultiSelectMessage); } else { oldValueElement.MergeAttribute("value", fieldValue.Value.ToString()); } var newValueElement = new TagBuilder("input"); // TODO: Add better intelligent input types, e.g., based on // DataTypeAttribute newValueElement.MergeAttribute("name", string.Format("{0}_NewValue", fieldName)); newValueElement.MergeAttribute("type", "text"); newValueElement.MergeAttribute("class", "kaia-ms-new form-control"); if (!fieldValue.IsUpdatable) { newValueElement.MergeAttribute("readonly", "readonly"); } if (fieldValue.IsUpdated || !fieldValue.IsIndeterminate) { newValueElement.MergeAttribute("value", fieldValue.Value.ToString()); } else { newValueElement.MergeAttribute("value", MultiSelectMessage); } IDictionary <string, string> properties = TagBuilderExtensions.DynamicToProperties(htmlAttributes); newValueElement.AddCustomHtmlAttributes(properties); var controlElement = new TagBuilder("span"); controlElement.MergeAttribute("class", "kaia-ms-ctl"); controlElement.MergeAttribute("data-kaia-ms-name", fieldName); controlElement.InnerHtml = string.Join(Environment.NewLine, new string[] { indeterminateFlagElement.ToString(), oldValueElement.ToString(), newValueElement.ToString() }); var result = MvcHtmlString.Create(controlElement.ToString()); return(result); }