MVC小系列(十八)【给checkbox和radiobutton添加集合的重载】


mvc对DropDownListFor的重载很多,但对checkbox和radiobutton没有对集合的重载

所以该讲主要针对集合的扩展:

 

#region 复选框扩展  
        /// <summary>
        /// 复选框扩展
        /// </summary>
        /// <typeparam name="TModel">模型类型</typeparam>
        /// <typeparam name="TProperty">属性类型</typeparam>
        /// <param name="helper">HTML辅助方法。</param>
        /// <param name="expression">lambda表达式。</param>
        /// <param name="selectList">选择项。</param>
        /// <param name="htmlAttributes">HTML属性。</param>
        /// <returns>返回复选框MVC的字符串。</returns>
        public static MvcHtmlString CheckBoxListFor<TModel, TProperty>(this HtmlHelper<TModel> helper,
                                                                        Expression<Func<TModel, TProperty>> expression,
                                                                        IEnumerable<SelectListItem> selectList,
                                                                        IDictionary<string, object> htmlAttributes = null)
        {
            if (selectList == null || expression == null)
            {
                return MvcHtmlString.Empty;
            }
            string name = ExpressionHelper.GetExpressionText(expression);
            object obj = helper.ViewData.Eval(name);
            string values = "," + obj + ",";
            StringBuilder sb = new StringBuilder();
            int index = 0;
            foreach (var item in selectList)
            {
                TagBuilder tag = new TagBuilder("input");
                tag.MergeAttributes<string, object>(htmlAttributes);
                tag.MergeAttribute("type", "checkbox", true);
                tag.MergeAttribute("name", name, true);
                tag.MergeAttribute("id", name + index, true);
                tag.MergeAttribute("value", item.Value, true);
                if (values.IndexOf("," + item.Value + ",") > -1)
                {
                    tag.MergeAttribute("checked", "checked", true);
                }
                sb.AppendLine(tag.ToString(TagRenderMode.SelfClosing) + " ");
                TagBuilder label = new TagBuilder("label");
                label.MergeAttribute("for", name + index);
                label.InnerHtml = item.Text;
                sb.AppendLine(label.ToString());
                index++;
            }
            return new MvcHtmlString(sb.ToString());
        }

        /// <summary>
        /// 复选框扩展。
        /// </summary>
        /// <typeparam name="TModel">模型类型。</typeparam>
        /// <typeparam name="TProperty">属性类型。</typeparam>
        /// <param name="helper">HTML辅助方法。</param>
        /// <param name="expression">lambda表达式。</param>
        /// <param name="selectList">选择项。</param>
        /// <param name="htmlAttributes">HTML属性。</param>
        /// <returns>返回复选框MVC的字符串。</returns>
        public static MvcHtmlString CheckBoxListFor<TModel, TProperty>(this HtmlHelper<TModel> helper,
                                                                        Expression<Func<TModel, TProperty>> expression,
                                                                        IEnumerable<SelectListItem> selectList,
                                                                        object htmlAttributes)
        {
            return helper.CheckBoxListFor<TModel, TProperty>(expression, selectList, new RouteValueDictionary(htmlAttributes));
        }
        #endregion

        #region 单选框扩展  
        /// <summary>
        /// 单选框扩展
        /// </summary>
        /// <typeparam name="TModel">模型类型</typeparam>
        /// <typeparam name="TProperty">属性类型</typeparam>
        /// <param name="helper">HTML辅助方法。</param>
        /// <param name="expression">lambda表达式。</param>
        /// <param name="selectList">选择项。</param>
        /// <param name="htmlAttributes">HTML属性。</param>
        /// <returns>返回复选框MVC的字符串。</returns>
        public static MvcHtmlString RadioBoxListFor<TModel, TProperty>(this HtmlHelper<TModel> helper,
                                                                        Expression<Func<TModel, TProperty>> expression,
                                                                        IEnumerable<SelectListItem> selectList,
                                                                        IDictionary<string, object> htmlAttributes = null)
        {
            if (selectList == null || expression == null)
            {
                return MvcHtmlString.Empty;
            }
            string name = ExpressionHelper.GetExpressionText(expression);
            object obj = helper.ViewData.Eval(name);
            string values = "," + obj + ",";
            StringBuilder sb = new StringBuilder();
            int index = 0;
            foreach (var item in selectList)
            {
                TagBuilder tag = new TagBuilder("input");
                tag.MergeAttributes<string, object>(htmlAttributes);
                tag.MergeAttribute("type", "radiobutton", true);
                tag.MergeAttribute("name", name, true);
                tag.MergeAttribute("id", name + index, true);
                tag.MergeAttribute("value", item.Value, true);
                if (values.IndexOf("," + item.Value + ",") > -1)
                {
                    tag.MergeAttribute("checked", "checked", true);
                }
                sb.AppendLine(tag.ToString(TagRenderMode.SelfClosing) + " ");
                TagBuilder label = new TagBuilder("label");
                label.MergeAttribute("for", name + index);
                label.InnerHtml = item.Text;
                sb.AppendLine(label.ToString());
                index++;
            }
            return new MvcHtmlString(sb.ToString());
        }

        /// <summary>
        /// 复选框扩展。
        /// </summary>
        /// <typeparam name="TModel">模型类型。</typeparam>
        /// <typeparam name="TProperty">属性类型。</typeparam>
        /// <param name="helper">HTML辅助方法。</param>
        /// <param name="expression">lambda表达式。</param>
        /// <param name="selectList">选择项。</param>
        /// <param name="htmlAttributes">HTML属性。</param>
        /// <returns>返回复选框MVC的字符串。</returns>
        public static MvcHtmlString RadioBoxListFor<TModel, TProperty>(this HtmlHelper<TModel> helper,
                                                                        Expression<Func<TModel, TProperty>> expression,
                                                                        IEnumerable<SelectListItem> selectList,
                                                                        object htmlAttributes)
        {
            return helper.CheckBoxListFor<TModel, TProperty>(expression, selectList, new RouteValueDictionary(htmlAttributes));
        }

        /// <summary>
        /// 自定义扩展方法
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="listInfos"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        public static MvcHtmlString CheckBoxList(this HtmlHelper htmlHelper, string name,

              List<CheckBoxListOver> listInfos, IDictionary<string, object> htmlAttributes)
        {

            if (string.IsNullOrEmpty(name))
            {

                throw new ArgumentException("此参数不能为空", "name");

            }

            if (listInfos == null)
            {

                throw new ArgumentException("listInfos");

            }

            StringBuilder sb = new StringBuilder();

            foreach (CheckBoxListOver info in listInfos)
            {

                TagBuilder builder = new TagBuilder("input");

                if (info.IsChecked)
                {

                    builder.MergeAttribute("checked", "checked");

                }

                builder.MergeAttributes(htmlAttributes);

                builder.MergeAttribute("type", "checkbox");

                builder.MergeAttribute("name", name);

                builder.InnerHtml = info.DisplayText;

                sb.Append(builder.ToString(TagRenderMode.Normal));

                sb.Append("<br />");

            }
            return new MvcHtmlString(sb.ToString());
        }
         
        ///// <summary>
        ///// 重载方法:不含属性键值对集合
        ///// </summary>
        ///// <param name="htmlHelper"></param>
        ///// <param name="name"></param>
        ///// <param name="listInfos"></param>
        ///// <returns></returns>
        //  public static MvcHtmlString CheckBoxList(this HtmlHelper htmlHelper, string name,

        //      List<CheckBoxListOver> listInfos)

        //  {

        //      return htmlHelper.CheckBoxList(name, listInfos, null);

        //  }

   

         
        ///// <summary>
        //  ///  重载方法:从路由中拿数据
        ///// </summary>
        ///// <param name="htmlHelper"></param>
        ///// <param name="name"></param>
        ///// <param name="listInfos"></param>
        ///// <param name="htmlAttributes"></param>
        ///// <returns></returns>
        //  public static MvcHtmlString CheckBoxList(this HtmlHelper htmlHelper, string name,

        //      List<CheckBoxListOver> listInfos, object htmlAttributes)

        //  {

        //      return htmlHelper.CheckBoxList(name, listInfos,

        //          ((IDictionary<string, object>) new RouteValueDictionary(htmlAttributes)));

        //  }

        public static MvcHtmlString CheckBoxList(this HtmlHelper htmlHelper, string name, List<CheckBoxListOver> listInfo)
        {
            return htmlHelper.CheckBoxList(name, listInfo, (IDictionary<string, object>)null, 0);
        }

        public static MvcHtmlString CheckBoxList(this HtmlHelper htmlHelper, string name, List<CheckBoxListOver> listInfo, object htmlAttributes)

          {

              return htmlHelper.CheckBoxList

              (

                  name,

                  listInfo,

                  (IDictionary<string, object>)new RouteValueDictionary(htmlAttributes),

                  0

              );

          }


         //public static MvcHtmlString CheckBoxList(this HtmlHelper htmlHelper, string name, List<CheckBoxListOver> listInfo, IDictionary<string, object> htmlAttributes)

         //{

         //    if (String.IsNullOrEmpty(name))

         //    {

         //        throw new ArgumentException("必须给CheckBoxList一个Tag Name", "name");

         //    }

         //    if (listInfo == null)

         //    {

         //        throw new ArgumentNullException("必须要设置List<CheckBoxListInfo> listInfo");

         //    }

         //    if (listInfo.Count < 1)

         //    {

         //        throw new ArgumentException("List<CheckBoxListInfo> listInfo 至少要一组资料", "listInfo");

         //    }

         //    StringBuilder sb = new StringBuilder();

         //    int lineNumber = 0;

         //    foreach (CheckBoxListOver info in listInfo)

         //    {

         //        lineNumber++;

         //        TagBuilder builder = new TagBuilder("input");

         //        if (info.IsChecked)

         //        {

         //            builder.MergeAttribute("checked", "checked");

         //        }

         //        builder.MergeAttributes<string, object>(htmlAttributes);

         //        builder.MergeAttribute("type", "checkbox");

         //        builder.MergeAttribute("value", info.Value);

         //        builder.MergeAttribute("name", name);

         //        builder.InnerHtml = string.Format(" {0} ", info.DisplayText);

         //        sb.Append(builder.ToString(TagRenderMode.Normal));

         //        sb.Append("</br>");

         //    }

         //    return new MvcHtmlString(sb.ToString());

         //}

         public static MvcHtmlString CheckBoxList(this HtmlHelper htmlHelper, string name, List<CheckBoxListOver> listInfo, IDictionary<string, object> htmlAttributes, int number)

          {
              if (listInfo== null)
              {
                  return null;
              }
              if (String.IsNullOrEmpty(name))

              {

                  throw new ArgumentException("必须给这些CheckBoxListOver一个Tag Name", "name");

              }

              if (listInfo == null)

              {

                  throw new ArgumentNullException("必须要设置List<CheckBoxListOver> listInfo");

              }

              if (listInfo.Count < 1)

              {

                  throw new ArgumentException("List<CheckBoxListOver> listInfo 至少要有一组数据", "listInfo");

              }

              StringBuilder sb = new StringBuilder();
              sb.Append("<table>");
              sb.Append("<tr>");
              int lineNumber = 0;
          
              foreach (CheckBoxListOver info in listInfo)
              {

                  lineNumber++;
                  TagBuilder builder = new TagBuilder("input");


                  if (info.IsChecked)
                  {

                      builder.MergeAttribute("checked", "checked");

                  }

                  builder.MergeAttributes<string, object>(htmlAttributes);

                  builder.MergeAttribute("type", "checkbox");

                  builder.MergeAttribute("value", info.Value);
                  builder.MergeAttribute("id", "myCheckbox");
                  builder.MergeAttribute("name", name);

                 // builder.InnerHtml = string.Format(" {0} ", info.DisplayText);

                  builder.InnerHtml = "<span style='font-size: 12pt;font-family:宋体'>" + info.DisplayText + "</span>";

                  sb.Append("<td>");
                  sb.Append(builder.ToString(TagRenderMode.Normal));
                  sb.Append("</td>");
                


                  if (number == 0)
                  {

                      sb.Append("<br />");

                  }

                  else if (lineNumber % number == 0)
                  {
                      sb.Append("</tr>");
                      sb.Append("<tr>");
                  }

              }
              sb.Append("</tr>");
              sb.Append("</table>");
              return new MvcHtmlString(sb.ToString());
          }

        #endregion


         #region 单选框和复选框的扩展
         /// <summary>
         /// 复选框,selValue为选中项
         /// </summary>
         /// <param name="htmlHelper"></param>
         /// <param name="name"></param>
         /// <param name="selectList"></param>
         /// <param name="selValue"></param>
         /// <returns></returns>
         public static MvcHtmlString CheckBox(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList, IEnumerable<string> selValue)
         {
             return CheckBoxAndRadioFor<object, string>(name, selectList, false, selValue);
         }
         public static MvcHtmlString CheckBox(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList, string selValue)
         {
             return CheckBox(htmlHelper, name, selectList, new List<string> { selValue });

         }
         /// <summary>
         /// 复选框
         /// </summary>
         /// <param name="htmlHelper"></param>
         /// <param name="name"></param>
         /// <param name="selectList"></param>
         /// <returns></returns>
         public static MvcHtmlString CheckBoxFor(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList)
         {
             return CheckBox(htmlHelper, name, selectList, new List<string>());
         }
         /// <summary>
         /// 根据列表输出checkbox
         /// </summary>
         /// <typeparam name="TModel"></typeparam>
         /// <typeparam name="TProperty"></typeparam>
         /// <param name="htmlHelper"></param>
         /// <param name="expression"></param>
         /// <param name="selectList"></param>
         /// <returns></returns>
         public static MvcHtmlString CheckBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList)
         {
             return CheckBoxFor(htmlHelper, expression, selectList, null);
         }

         /// <summary>
         ///  根据列表输出checkbox,selValue为默认选中的项
         /// </summary>
         /// <typeparam name="TModel"></typeparam>
         /// <typeparam name="TProperty"></typeparam>
         /// <param name="htmlHelper"></param>
         /// <param name="expression"></param>
         /// <param name="selectList"></param>
         /// <param name="selValue"></param>
         /// <returns></returns>
         public static MvcHtmlString CheckBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string selValue)
         {
             string name = ExpressionHelper.GetExpressionText(expression);
             return CheckBoxAndRadioFor<TModel, TProperty>(name, selectList, false, new List<string> { selValue });
         }
         /// <summary>
         /// 输出单选框和复选框
         /// </summary>
         /// <typeparam name="TModel"></typeparam>
         /// <typeparam name="TProperty"></typeparam>
         /// <param name="expression"></param>
         /// <param name="selectList"></param>
         /// <param name="isRadio"></param>
         /// <param name="selValue"></param>
         /// <returns></returns>
         static MvcHtmlString CheckBoxAndRadioFor<TModel, TProperty>(
             string name,
             IEnumerable<SelectListItem> selectList,
             bool isRadio,
             IEnumerable<string> selValue)
         {
             StringBuilder str = new StringBuilder();
             int c = 0;
             string check, activeClass;
             string type = isRadio ? "Radio" : "checkbox";

             foreach (var item in selectList)
             {
                 c++;
                 if (selValue != null && selValue.Contains(item.Value))
                 {
                     check = "checked='checked'";
                     activeClass = "style=color:red";
                 }
                 else
                 {
                     check = string.Empty;
                     activeClass = string.Empty;
                 }
                 str.AppendFormat("<span><input type='{3}' value='{0}' name={1} id={1}{2} " + check + "/>", item.Value, name, c, type);
                 str.AppendFormat("<label for='{0}{1}' {3}>{2}</lable></span>", name, c, item.Text, activeClass);

             }
             return MvcHtmlString.Create(str.ToString());
         }


         public static MvcHtmlString RadioButton(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList, IEnumerable<string> selValue)
         {
             return CheckBoxAndRadioFor<object, string>(name, selectList, true, selValue);
         }
         /// <summary>
         /// 单选按钮组,seletList为选中项
         /// </summary>
         /// <param name="htmlHelper"></param>
         /// <param name="name"></param>
         /// <param name="selectList"></param>
         /// <param name="selValue"></param>
         /// <returns></returns>
         public static MvcHtmlString RadioButton(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList, string selValue)
         {
             return RadioButton(htmlHelper, name, selectList, new List<string> { selValue });
         }
         /// <summary>
         /// 单选按钮组
         /// </summary>
         /// <param name="htmlHelper"></param>
         /// <param name="name"></param>
         /// <param name="selectList"></param>
         /// <returns></returns>
         public static MvcHtmlString RadioButton(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList)
         {
             return RadioButton(htmlHelper, name, selectList, new List<string>());
         }
         /// <summary>
         ///  根据列表输出radiobutton
         /// </summary>
         /// <typeparam name="TModel"></typeparam>
         /// <typeparam name="TProperty"></typeparam>
         /// <param name="htmlHelper"></param>
         /// <param name="expression"></param>
         /// <param name="selectList"></param>
         /// <returns></returns>
         public static MvcHtmlString RadioButtonFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList)
         {
             return RadioButtonFor(htmlHelper, expression, selectList, new List<string>());
         }
         public static MvcHtmlString RadioButtonFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, IEnumerable<string> selValue)
         {
             string name = ExpressionHelper.GetExpressionText(expression);
             return CheckBoxAndRadioFor<TModel, TProperty>(name, selectList, true, selValue);
         }
         /// <summary>
         /// 根据列表输出radiobutton,selValue为默认选中的项
         /// </summary>
         /// <typeparam name="TModel"></typeparam>
         /// <typeparam name="TProperty"></typeparam>
         /// <param name="htmlHelper"></param>
         /// <param name="expression"></param>
         /// <param name="selectList"></param>
         /// <param name="selValue"></param>
         /// <returns></returns>
         public static MvcHtmlString RadioButtonFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string selValue)
         {
             return RadioButtonFor(htmlHelper, expression, selectList, new List<string> { selValue });
         }
         #endregion
View Code

再来点其他的扩展,

     #region Admin area extensions

        public static MvcHtmlString Hint(this HtmlHelper helper, string value)
        {
            // Create tag builder
            var builder = new TagBuilder("img");

            // Add attributes
            var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
            var url = MvcHtmlString.Create(urlHelper.Content("~/Administration/Content/images/ico-help.gif")).ToHtmlString();

            builder.MergeAttribute("src", url);
            builder.MergeAttribute("alt", value);
            builder.MergeAttribute("title", value);

            // Render tag
            return MvcHtmlString.Create(builder.ToString());
        }

        public static HelperResult LocalizedEditor<T, TLocalizedModelLocal>(this HtmlHelper<T> helper, string name,
             Func<int, HelperResult> localizedTemplate,
             Func<T, HelperResult> standardTemplate)
            where T : ILocalizedModel<TLocalizedModelLocal>
            where TLocalizedModelLocal : ILocalizedModelLocal
        {
            return new HelperResult(writer =>
            {
                if (helper.ViewData.Model.Locales.Count > 1)
                {
                    var tabStrip = new StringBuilder();
                    tabStrip.AppendLine(string.Format("<div id='{0}'>", name));
                    tabStrip.AppendLine("<ul>");

                    //default tab
                    tabStrip.AppendLine("<li class='k-state-active'>");
                    tabStrip.AppendLine("Standard");
                    tabStrip.AppendLine("</li>");

                    for (int i = 0; i < helper.ViewData.Model.Locales.Count; i++)
                    {
                        //languages
                        var locale = helper.ViewData.Model.Locales[i];
                        var language = EngineContext.Current.Resolve<ILanguageService>().GetLanguageById(locale.LanguageId);

                        tabStrip.AppendLine("<li>");
                        var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
                        var iconUrl = urlHelper.Content("~/Content/images/flags/" + language.FlagImageFileName);
                        tabStrip.AppendLine(string.Format("<img class='k-image' alt='' src='{0}'>", iconUrl));
                        tabStrip.AppendLine(HttpUtility.HtmlEncode(language.Name));
                        tabStrip.AppendLine("</li>");
                    }
                    tabStrip.AppendLine("</ul>");



                    //default tab
                    tabStrip.AppendLine("<div>");
                    tabStrip.AppendLine(standardTemplate(helper.ViewData.Model).ToHtmlString());
                    tabStrip.AppendLine("</div>");

                    for (int i = 0; i < helper.ViewData.Model.Locales.Count; i++)
                    {
                        //languages
                        tabStrip.AppendLine("<div>");
                        tabStrip.AppendLine(localizedTemplate(i).ToHtmlString());
                        tabStrip.AppendLine("</div>");
                    }
                    tabStrip.AppendLine("</div>");
                    tabStrip.AppendLine("<script>");
                    tabStrip.AppendLine("$(document).ready(function() {");
                    tabStrip.AppendLine(string.Format("$('#{0}').kendoTabStrip(", name));
                    tabStrip.AppendLine("{");
                    tabStrip.AppendLine("animation:  {");
                    tabStrip.AppendLine("open: {");
                    tabStrip.AppendLine("effects: \"fadeIn\"");
                    tabStrip.AppendLine("}");
                    tabStrip.AppendLine("}");
                    tabStrip.AppendLine("});");
                    tabStrip.AppendLine("});");
                    tabStrip.AppendLine("</script>");
                    writer.Write(new MvcHtmlString(tabStrip.ToString()));
                }
                else
                {
                    standardTemplate(helper.ViewData.Model).WriteTo(writer);
                }
            });
        }
        public static MvcHtmlString DeleteConfirmation<T>(this HtmlHelper<T> helper, string buttonsSelector) where T : BaseYipondEntityModel
        {
            return DeleteConfirmation<T>(helper, "", buttonsSelector);
        }

        public static MvcHtmlString DeleteConfirmation<T>(this HtmlHelper<T> helper, string actionName,
            string buttonsSelector) where T : BaseYipondEntityModel
        {
            if (String.IsNullOrEmpty(actionName))
                actionName = "Delete";

            var modalId =  MvcHtmlString.Create(helper.ViewData.ModelMetadata.ModelType.Name.ToLower() + "-delete-confirmation")
                .ToHtmlString();

            var deleteConfirmationModel = new DeleteConfirmationModel
            {
                Id = helper.ViewData.Model.Id,
                ControllerName = helper.ViewContext.RouteData.GetRequiredString("controller"),
                ActionName = actionName,
                WindowId = modalId
            };

            var window = new StringBuilder();
            window.AppendLine(string.Format("<div id='{0}' style='display:none;'>", modalId));
            window.AppendLine(helper.Partial("Delete", deleteConfirmationModel).ToHtmlString());
            window.AppendLine("</div>");
            window.AppendLine("<script>");
            window.AppendLine("$(document).ready(function() {");
            window.AppendLine(string.Format("$('#{0}').click(function (e) ", buttonsSelector));
            window.AppendLine("{");
            window.AppendLine("e.preventDefault();");
            window.AppendLine(string.Format("var window = $('#{0}');", modalId));
            window.AppendLine("if (!window.data('kendoWindow')) {");
            window.AppendLine("window.kendoWindow({");
            window.AppendLine("modal: true,");
            window.AppendLine(string.Format("title: '{0}',", EngineContext.Current.Resolve<ILocalizationService>().GetResource("Admin.Common.AreYouSure")));
            window.AppendLine("actions: ['Close']");
            window.AppendLine("});");
            window.AppendLine("}");
            window.AppendLine("window.data('kendoWindow').center().open();");
            window.AppendLine("});");
            window.AppendLine("});");
            window.AppendLine("</script>");

            return MvcHtmlString.Create(window.ToString());
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="helper"></param>
        /// <param name="actionName"></param>
        /// <param name="buttonsSelector"></param>
        /// <returns></returns>
        public static MvcHtmlString DeleteConfirmation<T>(this HtmlHelper<T> helper, string actionName, int itemId,
         string buttonsSelector) where T : BaseYipondEntityModel
        {
            if (String.IsNullOrEmpty(actionName))
                actionName = "Delete";

            var modalId = MvcHtmlString.Create(helper.ViewData.ModelMetadata.ModelType.Name.ToLower() + "-delete-confirmation")
                .ToHtmlString();

            var deleteConfirmationModel = new DeleteConfirmationModel
            {
                Id = itemId,
                ControllerName = helper.ViewContext.RouteData.GetRequiredString("controller"),
                ActionName = actionName,
                WindowId = modalId
            };

            var window = new StringBuilder();
            window.AppendLine(string.Format("<div id='{0}' style='display:none;'>", modalId));
            window.AppendLine(helper.Partial("Delete", deleteConfirmationModel).ToHtmlString());
            window.AppendLine("</div>");
            window.AppendLine("<script>");
            window.AppendLine("$(document).ready(function() {");
            window.AppendLine(string.Format("$('#{0}').click(function (e) ", buttonsSelector));
            window.AppendLine("{");
            window.AppendLine("e.preventDefault();");
            window.AppendLine(string.Format("var window = $('#{0}');", modalId));
            window.AppendLine("if (!window.data('kendoWindow')) {");
            window.AppendLine("window.kendoWindow({");
            window.AppendLine("modal: true,");
            window.AppendLine(string.Format("title: '{0}',", EngineContext.Current.Resolve<ILocalizationService>().GetResource("Admin.Common.AreYouSure")));
            window.AppendLine("actions: ['Close']");
            window.AppendLine("});");
            window.AppendLine("}");
            window.AppendLine("window.data('kendoWindow').center().open();");
            window.AppendLine("});");
            window.AppendLine("});");
            window.AppendLine("</script>");

            return MvcHtmlString.Create(window.ToString());
        }

        public static MvcHtmlString DeleteBrandCateConfirmation<T>(this HtmlHelper<T> helper, string buttonsSelector) where T : BaseYipondEntityModel
        {
            return DeleteBrandCateConfirmation<T>(helper, "", buttonsSelector);
        }

        public static MvcHtmlString DeleteBrandCateConfirmation<T>(this HtmlHelper<T> helper, string actionName,
            string buttonsSelector) where T : BaseYipondEntityModel
        {
            if (String.IsNullOrEmpty(actionName))
                actionName = "BrandCategoryDelete";

            var modalId = MvcHtmlString.Create(helper.ViewData.ModelMetadata.ModelType.Name.ToLower() + "-delete-confirmation")
                .ToHtmlString();

            var deleteConfirmationModel = new DeleteConfirmationModel
            {
                Id = helper.ViewData.Model.Id,
                ControllerName = helper.ViewContext.RouteData.GetRequiredString("controller"),
                ActionName = actionName,
                WindowId = modalId
            };

            var window = new StringBuilder();
            window.AppendLine(string.Format("<div id='{0}' style='display:none;'>", modalId));
            window.AppendLine(helper.Partial("Delete", deleteConfirmationModel).ToHtmlString());
            window.AppendLine("</div>");
            window.AppendLine("<script>");
            window.AppendLine("$(document).ready(function() {");
            window.AppendLine(string.Format("$('#{0}').click(function (e) ", buttonsSelector));
            window.AppendLine("{");
            window.AppendLine("e.preventDefault();");
            window.AppendLine(string.Format("var window = $('#{0}');", modalId));
            window.AppendLine("if (!window.data('kendoWindow')) {");
            window.AppendLine("window.kendoWindow({");
            window.AppendLine("modal: true,");
            window.AppendLine(string.Format("title: '{0}',", EngineContext.Current.Resolve<ILocalizationService>().GetResource("Admin.Common.AreYouSure")));
            window.AppendLine("actions: ['Close']");
            window.AppendLine("});");
            window.AppendLine("}");
            window.AppendLine("window.data('kendoWindow').center().open();");
            window.AppendLine("});");
            window.AppendLine("});");
            window.AppendLine("</script>");

            return MvcHtmlString.Create(window.ToString());
        }

        public static MvcHtmlString DeleteConfirmationInfo<T>(this HtmlHelper<T> helper, string buttonsSelector) where T : BaseYipondEntityModel
        {
            return DeleteConfirmationInfo<T>(helper, "", buttonsSelector);
        }

        public static MvcHtmlString DeleteConfirmationInfo<T>(this HtmlHelper<T> helper, string actionName,
            string buttonsSelector) where T : BaseYipondEntityModel
        {
            if (String.IsNullOrEmpty(actionName))
                actionName = "CostDelete";

            var modalId = MvcHtmlString.Create(helper.ViewData.ModelMetadata.ModelType.Name.ToLower() + "-delete-confirmation")
                .ToHtmlString();

            var deleteConfirmationModel = new DeleteConfirmationModel
            {
                Id = helper.ViewData.Model.Id,
                ControllerName = helper.ViewContext.RouteData.GetRequiredString("controller"),
                ActionName = actionName,
                WindowId = modalId
            };

            var window = new StringBuilder();
            window.AppendLine(string.Format("<div id='{0}' style='display:none;'>", modalId));
            window.AppendLine(helper.Partial("Delete", deleteConfirmationModel).ToHtmlString());
            window.AppendLine("</div>");
            window.AppendLine("<script>");
            window.AppendLine("$(document).ready(function() {");
            window.AppendLine(string.Format("$('#{0}').click(function (e) ", buttonsSelector));
            window.AppendLine("{");
            window.AppendLine("e.preventDefault();");
            window.AppendLine(string.Format("var window = $('#{0}');", modalId));
            window.AppendLine("if (!window.data('kendoWindow')) {");
            window.AppendLine("window.kendoWindow({");
            window.AppendLine("modal: true,");
            window.AppendLine(string.Format("title: '{0}',", EngineContext.Current.Resolve<ILocalizationService>().GetResource("Admin.Common.AreYouSure")));
            window.AppendLine("actions: ['Close']");
            window.AppendLine("});");
            window.AppendLine("}");
            window.AppendLine("window.data('kendoWindow').center().open();");
            window.AppendLine("});");
            window.AppendLine("});");
            window.AppendLine("</script>");

            return MvcHtmlString.Create(window.ToString());
        }


        public static MvcHtmlString DeleteConfirmationJLInfo<T>(this HtmlHelper<T> helper, string buttonsSelector) where T : BaseYipondEntityModel
        {
            return DeleteConfirmationJLInfo<T>(helper, "", buttonsSelector);
        }

        public static MvcHtmlString DeleteConfirmationJLInfo<T>(this HtmlHelper<T> helper, string actionName,
            string buttonsSelector) where T : BaseYipondEntityModel
        {
            if (String.IsNullOrEmpty(actionName))
                actionName = "JLCostDelete";

            var modalId = MvcHtmlString.Create(helper.ViewData.ModelMetadata.ModelType.Name.ToLower() + "-delete-confirmation")
                .ToHtmlString();

            var deleteConfirmationModel = new DeleteConfirmationModel
            {
                Id = helper.ViewData.Model.Id,
                ControllerName = helper.ViewContext.RouteData.GetRequiredString("controller"),
                ActionName = actionName,
                WindowId = modalId
            };

            var window = new StringBuilder();
            window.AppendLine(string.Format("<div id='{0}' style='display:none;'>", modalId));
            window.AppendLine(helper.Partial("Delete", deleteConfirmationModel).ToHtmlString());
            window.AppendLine("</div>");
            window.AppendLine("<script>");
            window.AppendLine("$(document).ready(function() {");
            window.AppendLine(string.Format("$('#{0}').click(function (e) ", buttonsSelector));
            window.AppendLine("{");
            window.AppendLine("e.preventDefault();");
            window.AppendLine(string.Format("var window = $('#{0}');", modalId));
            window.AppendLine("if (!window.data('kendoWindow')) {");
            window.AppendLine("window.kendoWindow({");
            window.AppendLine("modal: true,");
            window.AppendLine(string.Format("title: '{0}',", EngineContext.Current.Resolve<ILocalizationService>().GetResource("Admin.Common.AreYouSure")));
            window.AppendLine("actions: ['Close']");
            window.AppendLine("});");
            window.AppendLine("}");
            window.AppendLine("window.data('kendoWindow').center().open();");
            window.AppendLine("});");
            window.AppendLine("});");
            window.AppendLine("</script>");

            return MvcHtmlString.Create(window.ToString());
        }


        public static MvcHtmlString DeleteConfirmationSellerInfo<T>(this HtmlHelper<T> helper, string buttonsSelector) where T : BaseYipondEntityModel
        {
            return DeleteConfirmationSellerInfo<T>(helper, "", buttonsSelector);
        }

        public static MvcHtmlString DeleteConfirmationSellerInfo<T>(this HtmlHelper<T> helper, string actionName,
            string buttonsSelector) where T : BaseYipondEntityModel
        {
            if (String.IsNullOrEmpty(actionName))
                actionName = "SellerCostDelete";

            var modalId = MvcHtmlString.Create(helper.ViewData.ModelMetadata.ModelType.Name.ToLower() + "-delete-confirmation")
                .ToHtmlString();

            var deleteConfirmationModel = new DeleteConfirmationModel
            {
                Id = helper.ViewData.Model.Id,
                ControllerName = helper.ViewContext.RouteData.GetRequiredString("controller"),
                ActionName = actionName,
                WindowId = modalId
            };

            var window = new StringBuilder();
            window.AppendLine(string.Format("<div id='{0}' style='display:none;'>", modalId));
            window.AppendLine(helper.Partial("Delete", deleteConfirmationModel).ToHtmlString());
            window.AppendLine("</div>");
            window.AppendLine("<script>");
            window.AppendLine("$(document).ready(function() {");
            window.AppendLine(string.Format("$('#{0}').click(function (e) ", buttonsSelector));
            window.AppendLine("{");
            window.AppendLine("e.preventDefault();");
            window.AppendLine(string.Format("var window = $('#{0}');", modalId));
            window.AppendLine("if (!window.data('kendoWindow')) {");
            window.AppendLine("window.kendoWindow({");
            window.AppendLine("modal: true,");
            window.AppendLine(string.Format("title: '{0}',", EngineContext.Current.Resolve<ILocalizationService>().GetResource("Admin.Common.AreYouSure")));
            window.AppendLine("actions: ['Close']");
            window.AppendLine("});");
            window.AppendLine("}");
            window.AppendLine("window.data('kendoWindow').center().open();");
            window.AppendLine("});");
            window.AppendLine("});");
            window.AppendLine("</script>");

            return MvcHtmlString.Create(window.ToString());
        }


        public static MvcHtmlString DeleteConfirmationStoreInfo<T>(this HtmlHelper<T> helper, string buttonsSelector) where T : BaseYipondEntityModel
        {
            return DeleteConfirmationStoreInfo<T>(helper, "", buttonsSelector);
        }

        public static MvcHtmlString DeleteConfirmationStoreInfo<T>(this HtmlHelper<T> helper, string actionName,
            string buttonsSelector) where T : BaseYipondEntityModel
        {
            if (String.IsNullOrEmpty(actionName))
                actionName = "StoreCostDelete";

            var modalId = MvcHtmlString.Create(helper.ViewData.ModelMetadata.ModelType.Name.ToLower() + "-delete-confirmation")
                .ToHtmlString();

            var deleteConfirmationModel = new DeleteConfirmationModel
            {
                Id = helper.ViewData.Model.Id,
                ControllerName = helper.ViewContext.RouteData.GetRequiredString("controller"),
                ActionName = actionName,
                WindowId = modalId
            };

            var window = new StringBuilder();
            window.AppendLine(string.Format("<div id='{0}' style='display:none;'>", modalId));
            window.AppendLine(helper.Partial("Delete", deleteConfirmationModel).ToHtmlString());
            window.AppendLine("</div>");
            window.AppendLine("<script>");
            window.AppendLine("$(document).ready(function() {");
            window.AppendLine(string.Format("$('#{0}').click(function (e) ", buttonsSelector));
            window.AppendLine("{");
            window.AppendLine("e.preventDefault();");
            window.AppendLine(string.Format("var window = $('#{0}');", modalId));
            window.AppendLine("if (!window.data('kendoWindow')) {");
            window.AppendLine("window.kendoWindow({");
            window.AppendLine("modal: true,");
            window.AppendLine(string.Format("title: '{0}',", EngineContext.Current.Resolve<ILocalizationService>().GetResource("Admin.Common.AreYouSure")));
            window.AppendLine("actions: ['Close']");
            window.AppendLine("});");
            window.AppendLine("}");
            window.AppendLine("window.data('kendoWindow').center().open();");
            window.AppendLine("});");
            window.AppendLine("});");
            window.AppendLine("</script>");

            return MvcHtmlString.Create(window.ToString());
        }

        public static MvcHtmlString YipondLabelFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, bool displayHint = true)
        {
            var result = new StringBuilder();
            var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
            var hintResource = string.Empty;
            object value = null;
            if (metadata.AdditionalValues.TryGetValue("YipondResourceDisplayName", out value))
            {
                var resourceDisplayName = value as YipondResourceDisplayName;
                if (resourceDisplayName != null && displayHint)
                {
                    var langId = EngineContext.Current.Resolve<IWorkContext>().WorkingLanguage.Id;
                    hintResource =
                        EngineContext.Current.Resolve<ILocalizationService>()
                        .GetResource(resourceDisplayName.ResourceKey + ".Hint", langId);

                    result.Append(helper.Hint(hintResource).ToHtmlString());
                }
            }
            result.Append(helper.LabelFor(expression, new { title = hintResource }));
            return MvcHtmlString.Create(result.ToString());
        }

        public static MvcHtmlString OverrideStoreCheckboxFor<TModel, TValue>(this HtmlHelper<TModel> helper,
            Expression<Func<TModel, bool>> expression,
            Expression<Func<TModel, TValue>> forInputExpression,
            int activeStoreScopeConfiguration)
        {
            var dataInputIds = new List<string>();
            dataInputIds.Add(helper.FieldIdFor(forInputExpression));
            return OverrideStoreCheckboxFor(helper, expression, activeStoreScopeConfiguration, null, dataInputIds.ToArray());
        }
        public static MvcHtmlString OverrideStoreCheckboxFor<TModel, TValue1, TValue2>(this HtmlHelper<TModel> helper,
            Expression<Func<TModel, bool>> expression,
            Expression<Func<TModel, TValue1>> forInputExpression1,
            Expression<Func<TModel, TValue2>> forInputExpression2,
            int activeStoreScopeConfiguration)
        {
            var dataInputIds = new List<string>();
            dataInputIds.Add(helper.FieldIdFor(forInputExpression1));
            dataInputIds.Add(helper.FieldIdFor(forInputExpression2));
            return OverrideStoreCheckboxFor(helper, expression, activeStoreScopeConfiguration, null, dataInputIds.ToArray());
        }
        public static MvcHtmlString OverrideStoreCheckboxFor<TModel, TValue1, TValue2, TValue3>(this HtmlHelper<TModel> helper,
            Expression<Func<TModel, bool>> expression,
            Expression<Func<TModel, TValue1>> forInputExpression1,
            Expression<Func<TModel, TValue2>> forInputExpression2,
            Expression<Func<TModel, TValue3>> forInputExpression3,
            int activeStoreScopeConfiguration)
        {
            var dataInputIds = new List<string>();
            dataInputIds.Add(helper.FieldIdFor(forInputExpression1));
            dataInputIds.Add(helper.FieldIdFor(forInputExpression2));
            dataInputIds.Add(helper.FieldIdFor(forInputExpression3));
            return OverrideStoreCheckboxFor(helper, expression, activeStoreScopeConfiguration, null, dataInputIds.ToArray());
        }
        public static MvcHtmlString OverrideStoreCheckboxFor<TModel>(this HtmlHelper<TModel> helper,
            Expression<Func<TModel, bool>> expression,
            string parentContainer,
            int activeStoreScopeConfiguration)
        {
            return OverrideStoreCheckboxFor(helper, expression, activeStoreScopeConfiguration, parentContainer);
        }
        private static MvcHtmlString OverrideStoreCheckboxFor<TModel>(this HtmlHelper<TModel> helper,
            Expression<Func<TModel, bool>> expression,
            int activeStoreScopeConfiguration,
            string parentContainer = null,
            params string[] datainputIds)
        {
            if (String.IsNullOrEmpty(parentContainer) && datainputIds == null)
                throw new ArgumentException("Specify at least one selector");

            var result = new StringBuilder();
            if (activeStoreScopeConfiguration > 0)
            {
                //render only when a certain store is chosen
                const string cssClass = "multi-store-override-option";
                string dataInputSelector = "";
                if (!String.IsNullOrEmpty(parentContainer))
                {
                    dataInputSelector = "#" + parentContainer + " input, #" + parentContainer + " textarea, #" + parentContainer + " select";
                }
                if (datainputIds != null && datainputIds.Length > 0)
                {
                    dataInputSelector = "#" + String.Join(", #", datainputIds);
                }
                var onClick = string.Format("checkOverridenStoreValue(this, '{0}')", dataInputSelector);
                result.Append(helper.CheckBoxFor(expression, new Dictionary<string, object>
                {
                    { "class", cssClass },
                    { "onclick", onClick },
                    { "data-for-input-selector", dataInputSelector },
                }));
            }
            return MvcHtmlString.Create(result.ToString());
        }

        /// <summary>
        /// Render CSS styles of selected index 
        /// </summary>
        /// <param name="helper">HTML helper</param>
        /// <param name="currentIndex">Current tab index (where appropriate CSS style should be rendred)</param>
        /// <param name="indexToSelect">Tab index to select</param>
        /// <returns>MvcHtmlString</returns>
        public static MvcHtmlString RenderSelectedTabIndex(this HtmlHelper helper, int currentIndex, int indexToSelect)
        {
            if (helper == null)
                throw new ArgumentNullException("helper");

            //ensure it's not negative
            if (indexToSelect < 0)
                indexToSelect = 0;
            
            //required validation
            if (indexToSelect == currentIndex)
            {
            return new MvcHtmlString(" class='k-state-active'");
            }

            return new MvcHtmlString("");
        }

        #endregion

        #region Common extensions

        public static MvcHtmlString RequiredHint(this HtmlHelper helper, string additionalText = null)
        {
            // Create tag builder
            var builder = new TagBuilder("span");
            builder.AddCssClass("required");
            var innerText = "*";
            //add additional text if specified
            if (!String.IsNullOrEmpty(additionalText))
                innerText += " " + additionalText;
            builder.SetInnerText(innerText);
            // Render tag
            return MvcHtmlString.Create(builder.ToString());
        }

        public static string FieldNameFor<T, TResult>(this HtmlHelper<T> html, Expression<Func<T, TResult>> expression)
        {
            return html.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression));
        }
        public static string FieldIdFor<T, TResult>(this HtmlHelper<T> html, Expression<Func<T, TResult>> expression)
        {
            var id = html.ViewData.TemplateInfo.GetFullHtmlFieldId(ExpressionHelper.GetExpressionText(expression));
            // because "[" and "]" aren't replaced with "_" in GetFullHtmlFieldId
            return id.Replace('[', '_').Replace(']', '_');
        }
        /// <summary>
        /// Creates a days, months, years drop down list using an HTML select control. 
        /// The parameters represent the value of the "name" attribute on the select control.
        /// </summary>
        /// <param name="html">HTML helper</param>
        /// <param name="dayName">"Name" attribute of the day drop down list.</param>
        /// <param name="monthName">"Name" attribute of the month drop down list.</param>
        /// <param name="yearName">"Name" attribute of the year drop down list.</param>
        /// <param name="beginYear">Begin year</param>
        /// <param name="endYear">End year</param>
        /// <param name="selectedDay">Selected day</param>
        /// <param name="selectedMonth">Selected month</param>
        /// <param name="selectedYear">Selected year</param>
        /// <param name="localizeLabels">Localize labels</param>
        /// <returns></returns>
        public static MvcHtmlString DatePickerDropDownsTaiWan(this HtmlHelper html,
            string dayName, string monthName, string yearName,
            int? beginYear = null, int? endYear = null,
            int? selectedDay = null, int? selectedMonth = null, int? selectedYear = null, bool localizeLabels = true)
        {
            var daysList = new TagBuilder("select");
            var monthsList = new TagBuilder("select");
            var yearsList = new TagBuilder("select");

            var daysListName = new TagBuilder("label");
            var monthsListName = new TagBuilder("label");
            var yearsListName = new TagBuilder("label");


            daysList.Attributes.Add("name", dayName);
            monthsList.Attributes.Add("name", monthName);
            yearsList.Attributes.Add("name", yearName);

            var days = new StringBuilder();
            var months = new StringBuilder();
            var years = new StringBuilder();

            string dayLocale, monthLocale, yearLocale;
            if (localizeLabels)
            {
                var locService = EngineContext.Current.Resolve<ILocalizationService>();
                dayLocale = locService.GetResource("Yipond.Info.Fileds.Day");
                monthLocale = locService.GetResource("Yipond.Info.Fileds.Month");
                yearLocale = locService.GetResource("Yipond.Info.Fileds.Year");
            }
            else
            {
                dayLocale = "Day";
                monthLocale = "Month";
                yearLocale = "Year";
            }

            days.AppendFormat("<option value='{0}'>{1}</option>", "0", "");
            for (int i = 1; i <= 31; i++)
                days.AppendFormat("<option value='{0}'{1}>{0}</option>", i,
                    (selectedDay.HasValue && selectedDay.Value == i) ? " selected=\"selected\"" : null);


            months.AppendFormat("<option value='{0}'>{1}</option>", "0", "");
            for (int i = 1; i <= 12; i++)
            {
                months.AppendFormat("<option value='{0}'{1}>{2}</option>",
                                    i,
                                    (selectedMonth.HasValue && selectedMonth.Value == i) ? " selected=\"selected\"" : null,i);
            }


            years.AppendFormat("<option value='{0}'>{1}</option>", "0", "");

            if (beginYear == null)
                beginYear = CommonHelper.GetDateTimeNow().Year - 100;
            if (endYear == null)
                endYear = CommonHelper.GetDateTimeNow().Year;

            if (endYear > beginYear)
            {
                for (int i = beginYear.Value; i <= endYear.Value; i++)
                    years.AppendFormat("<option value='{0}'{1}>{0}</option>", i,
                        (selectedYear.HasValue && selectedYear.Value == i) ? " selected=\"selected\"" : null);
            }
            else
            {
                for (int i = beginYear.Value; i >= endYear.Value; i--)
                    years.AppendFormat("<option value='{0}'{1}>{0}</option>", i,
                        (selectedYear.HasValue && selectedYear.Value == i) ? " selected=\"selected\"" : null);
            }

            daysList.InnerHtml = days.ToString();
            monthsList.InnerHtml = months.ToString();
            yearsList.InnerHtml = years.ToString();

            daysListName.InnerHtml =dayLocale;
            monthsListName.InnerHtml =monthLocale ;
            yearsListName.InnerHtml = yearLocale;
            return MvcHtmlString.Create(string.Concat(yearsList, yearLocale, monthsList, monthLocale, daysList, daysListName));
        }
        /// <summary>
        /// Creates a days, months, years drop down list using an HTML select control. 
        /// The parameters represent the value of the "name" attribute on the select control.
        /// </summary>
        /// <param name="html">HTML helper</param>
        /// <param name="dayName">"Name" attribute of the day drop down list.</param>
        /// <param name="monthName">"Name" attribute of the month drop down list.</param>
        /// <param name="yearName">"Name" attribute of the year drop down list.</param>
        /// <param name="beginYear">Begin year</param>
        /// <param name="endYear">End year</param>
        /// <param name="selectedDay">Selected day</param>
        /// <param name="selectedMonth">Selected month</param>
        /// <param name="selectedYear">Selected year</param>
        /// <param name="localizeLabels">Localize labels</param>
        /// <returns></returns>
        public static MvcHtmlString DatePickerDropDowns(this HtmlHelper html,
            string dayName, string monthName, string yearName,
            int? beginYear = null, int? endYear = null,
            int? selectedDay = null, int? selectedMonth = null, int? selectedYear = null, bool localizeLabels = true)
        {
            var daysList = new TagBuilder("select");
            var monthsList = new TagBuilder("select");
            var yearsList = new TagBuilder("select");

            daysList.Attributes.Add("name", dayName);
            monthsList.Attributes.Add("name", monthName);
            yearsList.Attributes.Add("name", yearName);

            var days = new StringBuilder();
            var months = new StringBuilder();
            var years = new StringBuilder();

            string dayLocale, monthLocale, yearLocale;
            if (localizeLabels)
            {
                var locService = EngineContext.Current.Resolve<ILocalizationService>();
                dayLocale = locService.GetResource("Common.Day");
                monthLocale = locService.GetResource("Common.Month");
                yearLocale = locService.GetResource("Common.Year");
            }
            else
            {
                dayLocale = "Day";
                monthLocale = "Month";
                yearLocale = "Year";
            }

            days.AppendFormat("<option value='{0}'>{1}</option>", "0", dayLocale);
            for (int i = 1; i <= 31; i++)
                days.AppendFormat("<option value='{0}'{1}>{0}</option>", i,
                    (selectedDay.HasValue && selectedDay.Value == i) ? " selected=\"selected\"" : null);


            months.AppendFormat("<option value='{0}'>{1}</option>", "0", monthLocale);
            for (int i = 1; i <= 12; i++)
            {
                months.AppendFormat("<option value='{0}'{1}>{2}</option>",
                                    i, 
                                    (selectedMonth.HasValue && selectedMonth.Value == i) ? " selected=\"selected\"" : null,
                                    CultureInfo.CurrentUICulture.DateTimeFormat.GetMonthName(i));
            }


            years.AppendFormat("<option value='{0}'>{1}</option>", "0", yearLocale);

            if (beginYear == null)
                beginYear = CommonHelper.GetDateTimeNow().Year - 100;
            if (endYear == null)
                endYear = CommonHelper.GetDateTimeNow().Year;

            if (endYear > beginYear)
            {
                for (int i = beginYear.Value; i <= endYear.Value; i++)
                    years.AppendFormat("<option value='{0}'{1}>{0}</option>", i,
                        (selectedYear.HasValue && selectedYear.Value == i) ? " selected=\"selected\"" : null);
            }
            else
            {
                for (int i = beginYear.Value; i >= endYear.Value; i--)
                    years.AppendFormat("<option value='{0}'{1}>{0}</option>", i,
                        (selectedYear.HasValue && selectedYear.Value == i) ? " selected=\"selected\"" : null);
            }

            daysList.InnerHtml = days.ToString();
            monthsList.InnerHtml = months.ToString();
            yearsList.InnerHtml = years.ToString();

            return MvcHtmlString.Create(string.Concat(daysList, monthsList, yearsList));
        }

        public static MvcHtmlString Widget(this HtmlHelper helper, string widgetZone, object additionalData = null)
        {
            return helper.Action("WidgetsByZone", "Widget", new { widgetZone = widgetZone, additionalData = additionalData });
        }

        /// <summary>
        /// Renders the standard label with a specified suffix added to label text
        /// </summary>
        /// <typeparam name="TModel">Model</typeparam>
        /// <typeparam name="TValue">Value</typeparam>
        /// <param name="html">HTML helper</param>
        /// <param name="expression">Expression</param>
        /// <param name="htmlAttributes">HTML attributes</param>
        /// <param name="suffix">Suffix</param>
        /// <returns>Label</returns>
        public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes, string suffix)
        {
            string htmlFieldName = ExpressionHelper.GetExpressionText((LambdaExpression)expression);
            var metadata = ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData);
            string resolvedLabelText = metadata.DisplayName ?? (metadata.PropertyName ?? htmlFieldName.Split(new char[] { '.' }).Last<string>());
            if (string.IsNullOrEmpty(resolvedLabelText))
            {
                return MvcHtmlString.Empty;
            }
            var tag = new TagBuilder("label");
            tag.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName)));
            if (!String.IsNullOrEmpty(suffix))
            {
                resolvedLabelText = String.Concat(resolvedLabelText, suffix);
            }
            tag.SetInnerText(resolvedLabelText);

            var dictionary = ((IDictionary<string, object>)HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
            tag.MergeAttributes<string, object>(dictionary, true);

            return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));
        }

        #endregion
View Code

 

posted @ 2016-06-29 14:02  那就让我这样吧  阅读(457)  评论(0编辑  收藏  举报