HTML5技术

C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper - 懒得安分(2)

字号+ 作者:H5之家 来源:博客园 2016-08-04 17:00 我要评论( )

我们暂且只定义一个方法,其他的重载我们很好扩展,这里给所有的BootstrapHelper里面的Label标签统一添加了control-label样式,当然,如果你的项目里面的label标签定义了自己的样式,那么这里改成你需要的样式即可

我们暂且只定义一个方法,其他的重载我们很好扩展,这里给所有的BootstrapHelper里面的Label标签统一添加了“control-label”样式,当然,如果你的项目里面的label标签定义了自己的样式,那么这里改成你需要的样式即可。以上代码都比较基础,这里就不一一讲解。

3、定义BootstrapWebViewPage

以上定义了BootstrapHelper和LabelExtensions,准备工作是做好了,但是还少一个对象,比如我们在cshtml页面里面 @Html.Label("姓名") 这样写,Html变量是一个HtmlHelper类型的对象,那么,如果我们需要使用类似 @Bootstrap.Label() 这种写法,以此类推,Bootstrap变量应该也是一个BootstrapHelper类型的对象,那么如果我们要这么用,必须要先定义一个Bootstrap变量,这个变量到底在哪里定义呢。于是博主思考,Html变量是定义在哪里的呢?再次转到定义

原来是在WebViewPage这个类的子类中,同样,我们在Extensions文件夹里面也新建一个WebViewPage的子类BootstrapWebViewPage,实现代码如下:

namespace Extensions { BootstrapWebViewPage<T> : System.Web.Mvc.WebViewPage<T> { BootstrapHelper Bootstrap { get; set; } 初始化Bootstrap对象 InitHelpers() { base.InitHelpers(); Bootstrap = new BootstrapHelper(ViewContext, this); } Execute() { //throw new NotImplementedException(); } } }

至于这里的泛型,我们以后再来做讲解,这里先不做过多纠结

 4、实践

 有了以上三步,所有需要的方法和变量都齐全了,貌似已经“万事俱备只欠东风”了,是不是这样呢?我们来试一把

编译,将Index.cshtml页面关闭重新打开,发现仍然找不到Bootstrap对象

怎么回事呢,Html是可以找到的,那Bootstrap变量去哪里了呢。。。

经过一番查找资料,发现在View文件夹里面有一个web.config文件(之前一直没怎么在意这个东西,现在想想里面还是有学问的哦),里面有一个节点system.web.webPages.razor下面有一个pages节点,默认是这样的:

我们将pages节点的pageBaseType改成我们的WebViewPage

然后编译,重新打开Index.cshtml。

OK,可以找到Bootstrap对象了。我们将Index.cshtml里面写入如下内容:

@{ Layout = null; } Index @Html.Label("姓名") @Html.TextBox("a", "Jim") @Bootstrap.Label(null, "Bootstrap Label标签", null, null)

运行看看效果:

 

怎么还是报错呢?这个问题应该不难理解,因为在razor里面使用@调用后台变量和方法的时候也存在命名空间的概念,这个命名空间在哪里引用呢,还是在View文件夹里面的web.config里面,在system.web.webPages.razor节点下面存在namespace的节点,我们将自定义的Label()扩展方法所在的命名空间加进去即可。于是配置变成这样:

再次运行

三、BootstrapHelper组件完善

通过上面一系列发现坑、填坑的经历,一个最最简单的BootstrapHelper组件已经基本可用。我们将LabelExtensions简单完善下:

namespace Extensions { LabelExtensions { public static MvcHtmlString Label(this BootstrapHelper html, string id) { return Label(html, id, null, null, null); } public static MvcHtmlString Label(this BootstrapHelper html, string content) { return Label(html, null, content, null, null); } public static MvcHtmlString Label(this BootstrapHelper html, string id, string content) { return Label(html, id, content, null, null); } public static MvcHtmlString Label(this BootstrapHelper html, string id, string content, object htmlAttributes) { return Label(html, id, content, null, htmlAttributes); } 通过使用指定的 HTML 帮助器和窗体字段的名称,返回Label标签 MvcHtmlString Label(this BootstrapHelper html, string id, string content, string cssClass, object htmlAttributes) { //定义标签的名称 TagBuilder tag = ); //给标签增加额外的属性 IDictionary<string, object> attributes = BootstrapHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); if (!string.IsNullOrEmpty(id)) { attributes.Add(, id); } if (!string.IsNullOrEmpty(cssClass)) { //给标签增加样式 tag.AddCssClass(cssClass); } //给标签增加文本 tag.SetInnerText(content); tag.AddCssClass(); tag.MergeAttributes(attributes); return MvcHtmlString.Create(tag.ToString()); } } }

呵呵,是不是有模有样~~可能又有人要说博主“山寨”了,呵呵,不管山寨不山寨,你觉得爽就行。

四、总结

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • HTML5 进阶系列:拖放 API 实现拖放排序 - _林鑫

    HTML5 进阶系列:拖放 API 实现拖放排序 - _林鑫

    2017-05-02 11:02

  • JS组件系列——自己动手封装bootstrap-treegrid组件 - 懒得安分

    JS组件系列——自己动手封装bootstrap-treegrid组件 - 懒得安分

    2017-04-28 14:02

  • HTML5 进阶系列:indexedDB 数据库 - _林鑫

    HTML5 进阶系列:indexedDB 数据库 - _林鑫

    2017-04-27 14:02

  • HTML5 高级系列:web Storage - _林鑫

    HTML5 高级系列:web Storage - _林鑫

    2017-04-27 14:01

网友点评
y