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
再来点其他的扩展,
#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