前言:上篇介绍了下封装BootstrapHelper的一些基础知识,这篇继续来完善下。参考HtmlHelper的方式,这篇博主先来封装下一些常用的表单组件。关于BootstrapHelper封装的意义何在,上篇评论里面已经讨论得太多,这里也不想过多纠结。总之一句话:凡事有得必有失,就看你怎么去取舍。有兴趣的可以看看,没兴趣的权当博主讲了个“笑话”吧。
BootstrapHelper系列文章目录
C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper
C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(二)
C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)
一、新增泛型的BootstrapHelper
上篇博主只定义了一个BootstrapHelper的普通类型去继承HtmlHelper,由于考虑到需要使用lamada的方式去定义组件,博主又增加了一个BootstrapHelper的泛型类型。于是BootstrapHelper变成了这样。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace BootstrapExtensions { public class BootstrapHelper : System.Web.Mvc.HtmlHelper { /// <summary> /// 使用指定的视图上下文和视图数据容器来初始化 BootstrapHelper 类的新实例。 /// </summary> /// <param>视图上下文</param> /// <param>视图数据容器</param> public BootstrapHelper(ViewContext viewContext, IViewDataContainer viewDataContainer) : base(viewContext, viewDataContainer) { } /// <summary> /// 使用指定的视图上下文、视图数据容器和路由集合来初始化 BootstrapHelper 类的新实例。 /// </summary> /// <param>视图上下文</param> /// <param>视图数据容器</param> /// <param>路由集合</param> public BootstrapHelper(ViewContext viewContext, IViewDataContainer viewDataContainer, RouteCollection routeCollection) : base(viewContext, viewDataContainer, routeCollection) { } } /// <summary> /// 表示支持在强类型视图中呈现 Bootstrap 控件。 /// </summary> /// <typeparam></typeparam> public class BootstrapHelper<TModel> : BootstrapHelper { /// <summary> /// 使用指定的视图上下文和视图数据容器来初始化 <![CDATA[Net.Web.Mvc.BootstrapHelper<TModel>]]> 类的新实例。 /// </summary> /// <param>视图上下文。</param> /// <param>视图数据容器。</param> public BootstrapHelper(ViewContext viewContext, IViewDataContainer viewDataContainer) : base(viewContext, viewDataContainer) { } /// <summary> /// 使用指定的视图上下文、视图数据容器和路由集合来初始化 <![CDATA[Net.Web.Mvc.BootstrapHelper<TModel>]]> 类的新实例。 /// </summary> /// <param>视图上下文。</param> /// <param>视图数据容器。</param> /// <param>路由集合。</param> public BootstrapHelper(ViewContext viewContext, IViewDataContainer viewDataContainer, RouteCollection routeCollection) : base(viewContext, viewDataContainer, routeCollection) { } } }
我们的Bootstrap对象也定义成泛型对象
public abstract class BootstrapWebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel> { //在cshtml页面里面使用的变量 public BootstrapHelper<TModel> Bootstrap { get; set; } /// <summary> /// 初始化Bootstrap对象 /// </summary> public override void InitHelpers() { base.InitHelpers(); Bootstrap = new BootstrapHelper<TModel>(ViewContext, this); } public override void Execute() { //throw new NotImplementedException(); } }
这样做的意义就是为了在cshtml页面里面可以使用@Bootstrap.TextBoxFor(x => x.Name)这种写法。这个后面介绍,这里先埋个伏笔。
二、TextBoxExtensions
TextBoxExtensions.cs的实现代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Html; namespace BootstrapExtensions { /// <summary> /// bootstrap TextBox文本框的所有扩展 /// </summary> public static class TextBoxExtensions { /// <summary> /// 通过使用指定的 HTML 帮助器和窗体字段的名称,返回文本框标签 /// </summary> /// <param>扩展方法实例</param> /// <param>表单元素的name属性值</param> /// <returns>返回input type='text'标签</returns> public static MvcHtmlString TextBox(this BootstrapHelper html, string name) { return InputExtensions.Helper(html, InputType.Text, null, name, null, false, null); } /// <summary> /// 通过使用指定的 HTML 帮助器和窗体字段的名称,返回文本框标签 /// </summary> /// <param>扩展方法实例</param> /// <param>id</param> /// <param>表单元素的name属性值</param> /// <returns>返回input type='text'标签</returns> public static MvcHtmlString TextBox(this BootstrapHelper html, string id, string name) { return InputExtensions.Helper(html, InputType.Text, id, name, null, false, null); } /// <summary> /// 通过使用指定的 HTML 帮助器和窗体字段的名称,返回文本框标签 /// </summary> /// <param>扩展方法实例</param> /// <param>单元素的name属性值</param> /// <param>表单元素的value值</param> /// <returns>返回input type='text'标签</returns> public static MvcHtmlString TextBox(this BootstrapHelper html, string id, string name, object value) { return InputExtensions.Helper(html, InputType.Text, id, name, value, false, null); } /// <summary> /// 通过使用指定的 HTML 帮助器和窗体字段的名称,返回文本框标签 /// </summary> /// <param>扩展方法实例</param> /// <param>单元素的name属性值</param> /// <param>表单元素的value值</param> /// <param>bootstrap自带的文本框的提示输入值</param> /// <returns>返回input type='text'标签</returns> public static MvcHtmlString TextBox(this BootstrapHelper html, string id, string name, object value, string placeholder) { IDictionary<string, object> attributes = new Dictionary<string, object>(); if (!string.IsNullOrEmpty(placeholder)) { attributes.Add("placeholder", placeholder); } return InputExtensions.Helper(html, InputType.Text, id, name, value, false, attributes); } /// <summary> /// 通过使用指定的 HTML 帮助器和窗体字段的名称,返回文本框标签 /// </summary> /// <param>扩展方法实例</param> /// <param>单元素的name属性值</param> /// <param>表单元素的value值</param> /// <param>额外属性</param> /// <returns>返回input type='text'标签</returns> public static MvcHtmlString TextBox(this BootstrapHelper html, string id, string name, object value, object htmlAttributes) { IDictionary<string, object> attributes = BootstrapHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); return InputExtensions.Helper(html, InputType.Text, id, name, value, false, attributes); } /// <summary> /// 通过使用指定的 HTML 帮助器和窗体字段的名称,返回文本框标签 /// </summary> /// <param>扩展方法实例</param> /// <param>表单元素的name属性值</param> /// <param>表单元素的value值</param> /// <param>bootstrap自带的文本框的提示输入值</param> /// <param>额外属性</param> /// <returns>返回input type='text'标签</returns> public static MvcHtmlString TextBox(this BootstrapHelper html, string id, string name, object value, string placeholder, object htmlAttributes) { IDictionary<string, object> attributes = BootstrapHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); if (!string.IsNullOrEmpty(placeholder)) { attributes.Add("placeholder", placeholder); } return InputExtensions.Helper(html, InputType.Text, id, name, value, false, attributes); } public static MvcHtmlString TextBoxFor<TModel, TProperty>(this BootstrapHelper<TModel> html, Expression<Func<TModel, TProperty>> expression) { var model = (TModel)html.ViewData.Model; string propertyName; object value; InputExtensions.GetValueByExpression<TModel, TProperty>(expression, model, out propertyName, out value); return InputExtensions.Helper(html, InputType.Text, propertyName, propertyName, value, false, null); } } }
InputExtensions.cs