如何在ASP.NET MVC中创建CheckBoxListFor扩展方法?
发布时间:2020-05-23 19:09:06 所属栏目: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 – Oracle.ManagedDataAccess:TNS:无法解析指定的
- 回收ASP.NET应用程序是否会激起用户的兴趣?
- asp.net – 从DropDownList中删除列表项
- ASP.NET WebHooks和Signal-R之间的区别
- asp.net – 使用“DataType.Upload”属性为属性生成文件上传
- asp.net – 当DataSource中没有数据时,DetailsView不可见
- asp.net – 多数据库同步 – 带消息背板的SignalR
- asp.net – 如何在不重新启动应用程序的情况下清除网站的Ou
- entity-framework – 将DbContext注入FluentValidation验证
- asp.net-mvc – MVC和RadioButtonList
推荐文章
站长推荐
- asp.net – 从aspx页面中的Static方法访问ViewSt
- asp.net – 使用nginx作为IIS服务器的反向代理
- asp.net – 在asp:超链接中分配声明值的问题 错
- asp.net-mvc – 域模型中的ASP.NET MVC业务逻辑与
- ASP.NET MVC Web应用程序与ASP.NET Web应用程序
- asp.net-mvc-3 – 如何使用下拉列表的数据注释?
- kendo-ui – 剑道网格刷新(数据绑定两次)
- 如何在Asp.Net Web API 2中使用Owin OAuth2修改令
- asp.net – 如何使用外部登录提供程序创建刷新令
- asp.net-mvc-routing – @ Url.Action获取?附加
热点阅读
