/// <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()));
        }