/// <summary> /// RadioButtonList for 資料集 /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="TProperty"></typeparam> /// <param name="helper"></param> /// <param name="items">資料集</param> /// <param name="dataValueField">值欄位</param> /// <param name="dataTextField">顯示欄位</param> /// <param name="expression"></param> /// <param name="htmlAttributes"></param> /// <param name="appendOptionLabel">是否增加預設選項 例:請選擇</param> /// <param name="optionLabel">預設選項文字</param> /// <param name="direction">顯示方向:垂直、水平</param> /// <returns></returns> public static MvcHtmlString RadioButtonListForList <T, TProperty>(this HtmlHelper <T> helper , IEnumerable items, string dataValueField, string dataTextField, Expression <Func <T, TProperty> > expression , object htmlAttributes = null, bool appendOptionLabel = false, string optionLabel = null , RepeatDirections direction = RepeatDirections.Horizontal) { string name = BuildColumnNameFromModel(expression); var optionData = from object o in items select new KeyValuePair <string, string>(Eval(o, dataTextField), Eval(o, dataValueField)); string defaultSelectValue = helper.ViewData.Eval(name).ToString(); return(BuildRadioButtonList(helper, expression, name, defaultSelectValue, optionData, htmlAttributes, appendOptionLabel, optionLabel, direction)); }
/// <summary> /// RadioButtonList for 列舉 /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="TProperty"></typeparam> /// <param name="helper"></param> /// <param name="expression"></param> /// <param name="htmlAttributes"></param> /// <param name="appendOptionLabel">是否增加預設選項 例:請選擇</param> /// <param name="optionLabel">預設選項文字</param> /// <param name="direction">顯示方向:垂直、水平</param> /// <returns></returns> public static MvcHtmlString RadioButtonListForEnum <T, TProperty>(this HtmlHelper <T> helper , Expression <Func <T, TProperty> > expression , object htmlAttributes = null, bool appendOptionLabel = false, string optionLabel = null , RepeatDirections direction = RepeatDirections.Horizontal) { string name = BuildColumnNameFromModel(expression); Enum defaultSelectValue = helper.ViewData.Eval(name) as Enum; IList <SelectListItem> selectList = EnumHelper.GetSelectList(typeof(TProperty), defaultSelectValue); List <KeyValuePair <string, string> > optionData = new List <KeyValuePair <string, string> >(); foreach (var item in selectList) { optionData.Add(new KeyValuePair <string, string>(item.Text, item.Value)); } return(BuildRadioButtonList(helper, expression, name, Convert.ToInt32(defaultSelectValue).ToString(), optionData, htmlAttributes, appendOptionLabel, optionLabel, direction)); }
private static MvcHtmlString BuildRadioButtonList <T, TProperty>(HtmlHelper <T> helper, Expression <Func <T, TProperty> > expression, string name, string defaultSelectValue, IEnumerable <KeyValuePair <string, string> > optionData , object htmlAttributes, bool appendOptionLabel, string optionLabel, RepeatDirections direction = RepeatDirections.Horizontal) { StringBuilder renderHtmlTag = new StringBuilder(); IDictionary <string, string> newOptionData = new Dictionary <string, string>(); if (appendOptionLabel) { newOptionData.Add(new KeyValuePair <string, string>(optionLabel ?? "請選擇", "")); } foreach (var item in optionData) { newOptionData.Add(item); } int i = 0; foreach (var option in newOptionData) { string id = string.Format("{0}_{1}", name.Replace(".", "_"), i++); TagBuilder optionTag = new TagBuilder("input"); optionTag.Attributes.Add("type", "radio"); optionTag.Attributes.Add("name", name); optionTag.Attributes.Add("id", id); optionTag.Attributes.Add("value", option.Value); if (option.Value == defaultSelectValue) { optionTag.Attributes.Add("checked", "checked"); } RouteValueDictionary attribute = null; if (htmlAttributes != null) { attribute = new RouteValueDictionary(htmlAttributes); } else { attribute = new RouteValueDictionary(); } optionTag.MergeAttributes(attribute); ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); var unobtrusive = helper.GetUnobtrusiveValidationAttributes(name, metadata); optionTag.MergeAttributes(unobtrusive); var radio = optionTag.ToString(); renderHtmlTag.AppendFormat("<div class='{2}'><label>{0}{1}</label></div>", radio, option.Key, (direction == RepeatDirections.Horizontal ? "radio-inline" : "radio")); } return(new MvcHtmlString(renderHtmlTag.ToString())); }