阅读目录

  • 一、NumberBoxExtensions
  • 二、DateTimeBoxExtensions
    • 1、初始方案
    • 2、改进方案
  • 三、TextareExtensions
  • 四、SelectExtensions
  • 五、总结

正文

前言:之前的两篇封装了一些基础的表单组件,这篇继续来封装几个基于bootstrap的其他组件。和上篇不同的是,这篇的有几个组件需要某些js文件的支持。

本文原创地址:http://www.cnblogs.com/landeanfen/p/5842030.html

BootstrapHelper系列文章目录

  • C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper
  • C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(二)
  • C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)
回到顶部

一、NumberBoxExtensions

NumberBoxExtensions是一个基于bootstrap风格的数字文本框,基于之前博主介绍的自增器数字组件spinner去做的封装,不了解spinner组件的园友可以看看http://www.cnblogs.com/landeanfen/p/5461849.html里面介绍的第二个组件。

通过之前的介绍我们知道,自增组件spinner的初始化不需要写任何的js代码,直接通过配置html里面的data属性即可实现它的初始化,这样给我们的封装就带来了很大的方便,我们只需要将常用的初始化参数作为扩展方法的参数传进来,然后在后台变成相应的data属性返回到前端。

废话不多说,先将封装的源码摆上来。

 NumberBoxExtensions.cs

除去id、value,我们自增组件初始化需要的参数主要有min、max、step、rule等,分别对应组件的data-min、data-max、data-step、data-rule等参数。

使用相当简单,首先在对应的页面引用相关的js和css文件,然后在cshtml里面这样调用即可:

@Bootstrap.NumberTextBox(null, "1", 1, 10, 2, null)

得到结果:

这样比我们每次都去copy一大段html代码要方便多了吧,你有没有一丝心动呢~~

回到顶部

二、DateTimeBoxExtensions

有了上面的数字组件作为基础,接下来就是封装时间组件了。博主同样打算使用data属性去做初始化,可是找了半天文档,datatimepicker里面没有自带data属性初始化的方式,没办法,只有博主自己去做data属性的初始化了。

回到顶部

1、初始方案

我们新建一个文件:bootstrap-datetimepicker-helper.js。里面的代码如下

$(function () {var datetimedefault = {locale: 'zh-CN',      //中文化
    };$.each($(".date"), function (index, item) {var data = $(item).data();var param = $.extend({}, datetimedefault, data || {});$(item).datetimepicker(param);});
});

然后html代码这样写

<div class='input-group date' data-format="YYYY-MM-DD" data-maxDate="2017-01-10" data-minDate="2010-01-10"><input type='text' class="form-control" /><span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span>
</div>

貌似都没有问题,起初博主也以为没有任何问题。可是事与愿违!这里有一点博主没有考虑到,那就是Jquery里面的data()方法取到的属性名会全部转小写,也就是说,我们html里面写的data-maxDate,可是通过data()方法得到的结果却变成了maxdate,如下图:

然后在初始化datetimepicker的时候就报了js异常。此法行不通。

回到顶部

2、改进方案

既然上面的方法行不通,那我们就要改进啊,data()方法是否存在什么参数可以让它不转小写的?找了一圈,没找到啥答案。最后没办法,博主打算自行改造,于是js代码变成了这样:

$(function () {var datetimedefault = {format: 'YYYY-MM-DD',//日期格式化,只显示日期locale: 'zh-CN',      //中文化maxDate: '2017-01-01',//最大日期minDate: '2010-01-01', //最小日期viewMode: 'days',defaultDate: false,disabledDates: false,enabledDates: false,};$.each($(".date"), function (index, item) {var data = $(item).data();$.each(data, function (key, value) {for (i in datetimedefault) {if (key == i.toLowerCase()) {datetimedefault[i] = value;break;}}});//var param = $.extend({}, datetimedefault, data || {});
$(item).datetimepicker(datetimedefault);});
});

原理就是比较data()方法得到的结果和datetimedefault的属性名转小写后进行对比,如果相同,则将html里面的data属性覆盖默认的属性。调试了几遍,基本没发现什么问题。

代码写成这样,确实可以解决我们上面的问题,但是需要我们的 datetimedefault 变量里面包含足够多的默认参数,这样才能达到覆盖的目的,当然项目中一般修改的就那么几个参数,这里只需要加上一些我们经常需要变化的默认属性即可。

好了,有上面的作为理论基础,我们的DataTimeBox也就好封装了。直接上代码吧。

 DateTimeBoxExtensions.cs

然后我们的cshtml页面只需要引用我们的js和css

<link href="~/Content/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css" rel="stylesheet" />
<script src="~/Content/bootstrap-datetimepicker/js/moment-with-locales.js"></script>
<script src="~/Content/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js"></script>
<script src="~/Content/bootstrap-datetimepicker/js/bootstrap-datetimepicker-helper.js"></script>

然后直接使用

            <div class="col-xs-3">@Bootstrap.DateTimeBox("starttime", null, null, null, null, null, null)</div><div class="col-xs-3">@Bootstrap.DateTimeBox("endtime", null, null, null, null, null, null)</div>

得到结果

回到顶部

三、TextareExtensions

关于textarea文本域的封装相对来说是比较简单的,因为本身它的结构和TextBox就差不多,我们直接给出封装的源码吧。

 TextAreaExtensions.cs

只支持几个最简单的参数rows和cols,如果你的项目有一些特殊的需求,比如需要初始化成富文本编辑框,你也可以自己去改进。

使用方法

        <div>@Bootstrap.TextAreaBox("id", "", "", 3, 5)</div>

这里有一个问题要提一下,就是我们直接这样写,得到的结果却是:

貌似我们的cols属性没有起作用,原来,只要你的标签加了class='form-control'样式,那它就会在满撑整个div,解决的方法也很简单,比如我们可以在div上面做些处理:

        <div class="col-xs-3">@Bootstrap.TextAreaBox("", "", "", 3, 5)</div>

既然cols属性没有起作用,其实参数里面的cols可以考虑去掉。

回到顶部

四、SelectExtensions

又到了纠结的select下拉框。为什么说它纠结呢,因为封装它的时候要考虑很多问题,比如:

  • <optgroup>和<option>如何处理
  • 静态的option值如何传到后台
  • 是封装原始的select还是封装成基于某些组件(比如select2)的select
  • 方法和事件该如何处理等等

后来转念一想,封装的目的是为了什么?不就是为了使用起来更加方便吗,如果封得太死,使用起来能够方便吗?后来所幸直接封装成最简单的select算了。博主打算这样做:

如果是静态的option,直接写原生的select标签;如果是动态的option,则传递对应的url到后台,取到数据后生成option。封装的代码如下:

 SelectExtensions.cs

然后前端使用js去初始化,需要有一个js文件utility.combobox.js:

(function ($) {//1.定义jquery的扩展方法combobox$.fn.combobox = function (options, param) {if (typeof options == 'string') {return $.fn.combobox.methods[options](this, param);}//2.将调用时候传过来的参数和default参数合并options = $.extend({}, $.fn.combobox.defaults, options || {});//3.添加默认值var target = $(this);target.attr('valuefield', options.valueField);target.attr('textfield', options.textField);target.empty();var option = $('<option></option>');option.attr('value', '');option.text(options.placeholder);target.append(option);//4.判断用户传过来的参数列表里面是否包含数据data数据集,如果包含,不用发ajax从后台取,否则否送ajax从后台取数据if (options.data) {init(target, options.data);}else {//var param = {};
            options.onBeforeLoad.call(target, options.param);if (!options.url) return;if (typeof options.param == "string") {options.param = JSON.parse(options.param);}$.getJSON(options.url, options.param, function (data) {init(target, data);});}function init(target, data) {$.each(data, function (i, item) {var option = $('<option></option>');option.attr('value', item[options.valueField]);option.text(item[options.textField]);target.append(option);});options.onLoadSuccess.call(target);}target.unbind("change");target.on("change", function (e) {if (options.onChange)return options.onChange(target.val());});}//5.如果传过来的是字符串,代表调用方法。$.fn.combobox.methods = {getValue: function (jq) {return jq.val();},setValue: function (jq, param) {jq.val(param);},load: function (jq, url) {$.getJSON(url, function (data) {jq.empty();var option = $('<option></option>');option.attr('value', '');option.text('请选择');jq.append(option);$.each(data, function (i, item) {var option = $('<option></option>');option.attr('value', item[jq.attr('valuefield')]);option.text(item[jq.attr('textfield')]);jq.append(option);});});}};//6.默认参数列表$.fn.combobox.defaults = {url: null,param: null,data: null,valueField: 'value',textField: 'text',placeholder: '请选择',onBeforeLoad: function (param) { },onLoadSuccess: function () { },onChange: function (value) { }};//这一段是新加的,在页面初始化完成之后调用初始化方法$(document).ready(function () {$('select').each(function () {var $combobox = $(this);$.fn.combobox.call($combobox, $combobox.data());})});})(jQuery);

这个js文件来源于博主之前的一篇文章http://www.cnblogs.com/landeanfen/p/5159911.html

然后前端调用

            <div class="col-xs-2">@Bootstrap.SelectBox("sel", null, null, "/Home/GetDept", null, "Name", "Id")</div>

回到顶部

五、总结

至此,我们BootstrapHelper第一个版本的封装基本算是完成了,主要封装的组件有如下几个:

当然还有大家最喜欢源码分享了。

本文转自懒得安分博客园博客,原文链接:http://www.cnblogs.com/landeanfen/p/5842030.html,如需转载请自行联系原作者

C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)...相关推荐

  1. android触摸效果,Android开发进阶:仿MIUI12控件触摸反馈效果(下沉+倾斜)附源码...

    简单模仿了下MIUI12里控件的触摸反馈效果,转载请标明出处 效果简述 按压控件内圈区域,控件整体缩小,高度降低(阴影消失) 按压内圈 按压控件外圈区域,依据触摸点控件以中心为支点,向触摸点倾斜 按压 ...

  2. 克里金插值详细步骤_openlayers4 入门开发系列之前端动态渲染克里金插值 kriging 篇(附源码下载)...

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  3. SpringBoot整合Redis+mybatis,封装RedisUtils工具类等实战(附源码)

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:陈彦斌 cnblogs.com/chenyanbin/ ...

  4. 通过自定义组件学习Vue系列(二)【时间轴】(附源码)

    需求: 用于升级日志的显示 效果图: 实现原理: 主要区域分为两块,时间区和内容区,时间区是画一个圆点和显示一个时间,内容区左边一个竖线和文字显示 然后做一下循环,将每个日期的数据显示出来 布局采用f ...

  5. C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(二)

    阅读目录 一.新增泛型的BootstrapHelper 二.TextBoxExtensions 三.RadioExtensions和CheckboxExtensions 四.ButtonExtensi ...

  6. 一步一步手绘Spring AOP运行时序图(Spring AOP 源码分析)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  7. C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码...

    C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码 原文:C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码 前言 系列 ...

  8. C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码

    我记得,之前在写安卓方面的文章的时候,有人就问过我.Xamarin.Android为什么打包出来这么大?随便一个HelloWord就20-30MB? 嗯..今天我们就来解决这个问题.. 我们先从指定一 ...

  9. C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码...

    原文:C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码 前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github. ...

最新文章

  1. 为什么程序员都不写文档?
  2. Boost.Asio入门
  3. .NET 开源软件开发BIM工具包xBIM
  4. mysql事务嵌套 php_使用以下代码,MySQL中的PHP“嵌套”事务是否...
  5. Qt4_实现File菜单
  6. PHP处理CSV表格文件的常用操作方法是怎么样呢
  7. 产品经理面试题目转载
  8. [转载] 我的Android进阶之旅:经典的大牛博客推荐
  9. 电子购物网站设计—1
  10. 了解 SWFObject 2.0 应用
  11. Python 正则表达式提取文件后缀名
  12. 烟搭桥,酒开路?这届年轻人可能宁愿自断后路
  13. 计算机浏览器无法上网怎么办,电脑有网络,但是浏览器不能上网怎么办
  14. 2019年BET公司面试题目大汇总
  15. 推箱子C++实现 实训认识小游戏
  16. PIL库 : 居中对齐写入文本(英文 / 中文)
  17. 余弦相似度:通过计算两个向量的夹角余弦值来评估他们的相似度
  18. 【Linux】大数据开发中常用的shell命令
  19. antd select 等组件可搜索问题
  20. GitHub中Android开源项目及库汇总

热门文章

  1. python pdb调试快捷键_python pdb调试以及sublime3快捷键设置
  2. 学神python笔记
  3. Gateway源码分析
  4. Sentinel熔断限流器工作原理
  5. 天津科技大学中外合作办学计算机科学怎么样,天津科技大学计算机类(中外合作办学)(计算机科学与技术(信息处理专业2016年在安徽理科高考录取最低分数线...
  6. Spring Cloud 微服务实战系列-Eureka注册中心(二)
  7. Spring实用系列-深入了解SpringMVC OncePerRequestFilter过滤器原理
  8. java中json数据_java中的JSON对象的使用
  9. 【java并发编程艺术学习】(四)第二章 java并发机制的底层实现原理 学习记录(二) synchronized...
  10. debian8.7.1安装zabbix3.2