如何在ASP.NET MVC中创建CheckBoxListFor扩展方法?
发布时间:2020-12-16 00:22:31 所属栏目:asp.Net 来源:网络整理
导读:我知道ASP.NET MVC Html帮助程序扩展方法中有一个ListBoxFor扩展方法,但是我一直认为复选框列表比列表框更加用户友好。 在很好的旧WebForms中有一个非常方便的CheckBoxList控件,但显然这是现在的图片。 问题是,为什么ASP.NET MVC中没有办法创建一个复选框
我知道ASP.NET MVC Html帮助程序扩展方法中有一个ListBoxFor扩展方法,但是我一直认为复选框列表比列表框更加用户友好。
在很好的旧WebForms中有一个非常方便的CheckBoxList控件,但显然这是现在的图片。 问题是,为什么ASP.NET MVC中没有办法创建一个复选框列表?如何编写自己的扩展方法,创建一个复选框列表,并以类似的方式表现ListBoxFor的行为? 解决方法
这是一个用于CheckBoxListFor的强类型的HtmlHelper,它将所选项目作为数据在viewdata模型中处理。我选择不包装Html.CheckBox或Html.CheckBoxFor方法,因为我不想在我的复选框列表中隐藏“false”字段。
请随时改进这个和转发:-) //View <%: Html.CheckBoxListFor(model => model.FreightTypeIds,FreightTypeMultiSelectList) %> //Controller public ActionResult SomeAction(int[] FreightTypeIds) { //... return View(); } //Extension public static MvcHtmlString CheckBoxListFor<TModel,TProperty>(this HtmlHelper<TModel> htmlHelper,Expression<Func<TModel,IEnumerable<TProperty>>> expression,MultiSelectList allOptions,object htmlAttributes = null) { ModelMetadata modelMetadata = ModelMetadata.FromLambdaExpression<TModel,IEnumerable<TProperty>>(expression,htmlHelper.ViewData); // Derive property name for checkbox name string propertyName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(modelMetadata.PropertyName); // Get currently select values from the ViewData model IEnumerable<TProperty> list = expression.Compile().Invoke(htmlHelper.ViewData.Model); // Convert selected value list to a List<string> for easy manipulation IList<string> selectedValues = new List<string>(); if (list != null) { selectedValues = new List<TProperty>(list).ConvertAll<string>(delegate(TProperty i) { return i.ToString(); }); } // Create div TagBuilder divTag = new TagBuilder("div"); divTag.MergeAttributes(new RouteValueDictionary(htmlAttributes),true); // Add checkboxes foreach (SelectListItem item in allOptions) { divTag.InnerHtml += string.Format( "<div><input type="checkbox" name="{0}" id="{1}_{2}" " + "value="{2}" {3} /><label for="{1}_{2}">{4}</label></div>",propertyName,TagBuilder.CreateSanitizedId(propertyName),item.Value,selectedValues.Contains(item.Value) ? "checked="checked"" : string.Empty,item.Text); } return MvcHtmlString.Create(divTag.ToString()); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc-4 – ASP.NET MVC4模型没有绑定
- asp.net-mvc-3 – MVC3:用于发送表单(模型)值和额外参数的
- ASP.NET web.config文件是否失控?
- asp.net-mvc – 单元测试我的控制器方法导致一个空的ViewNa
- asp.net-mvc-3 – MVC3值不能为null 参数名称:值
- asp.net – 在Web.config更改后程序集不可用
- asp.net – 当绑定值包含冒号时,如何绑定GridView HyperLin
- asp.net – “创建应用服务”对话不检索信息,禁用创建按钮
- asp.net-mvc – 出现在MVC4 Razor View中的奇怪的空格
- asp.net – IIS HTTP错误500.19