微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一步一步封装自己的HtmlHelper组件BootstrapHelper三

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

BootstrapHelper系列文章目录

一、NumberBoxExtensions

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

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

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

rush:csharp;"> using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc;

namespace BootstrapExtensions
{
public static class NumberBoxExtensions
{
///


/// 生成数字文本框
///

/// <param name="html">扩展方法实例
/// <param name="id">id
/// 返回数字文本框
public static MvcHtmlString NumberTextBox(this BootstrapHelper html,string id)
{
return NumberTextBox(html,id,null,null);
}

///


/// 生成数字文本框
///

/// <param name="html">扩展方法实例
/// <param name="id">id
/// <param name="value">文本框的value值
/// 返回数字文本框
public static MvcHtmlString NumberTextBox(this BootstrapHelper html,string id,object value)
{
return NumberTextBox(html,value,null);
}

///


/// 生成数字文本框
///

/// <param name="html">扩展方法实例
/// <param name="value">文本框的value值
/// <param name="min">自增长的最小值
/// <param name="max">自增长的最大值
/// 返回数字文本框
public static MvcHtmlString NumberTextBox(this BootstrapHelper html,object value,int? min,int? max)
{
return NumberTextBox(html,min,max,null);
}

///


/// 生成数字文本框
///

/// <param name="html">扩展方法实例
/// <param name="id">id
/// <param name="value">文本框的value值
/// <param name="min">自增长的最小值
/// <param name="max">自增长的最大值
/// 返回数字文本框
public static MvcHtmlString NumberTextBox(this BootstrapHelper html,null);
}

///


/// 生成数字文本框
///

/// <param name="html">扩展方法实例
/// <param name="id">id
/// <param name="value">文本框的value值
/// <param name="min">自增长的最小值
/// <param name="max">自增长的最大值
/// <param name="step">每次自增的数字
/// 返回数字文本框
public static MvcHtmlString NumberTextBox(this BootstrapHelper html,int? max,int? step)
{
return NumberTextBox(html,step,null);
}

///


/// 生成数字文本框
///

/// <param name="html">扩展方法实例
/// <param name="id">id
/// <param name="value">文本框的value值
/// <param name="min">自增长的最小值
/// <param name="max">自增长的最大值
/// <param name="step">每次自增的数字
/// <param name="rule">自增规则
/// 返回数字文本框
public static MvcHtmlString NumberTextBox(this BootstrapHelper html,int? step,SpinningRule? rule)
{
TagBuilder tag = new TagBuilder("div");
tag.MergeAttribute("class","input-group spinner");
tag.MergeAttribute("data-trigger","spinner");

System.Text.StringBuilder sb = new System.Text.StringBuilder();
//sb.Append("");
sb.Append("<input type='text' class='form-control text-center' ");
if (!string.IsNullOrEmpty(id))
{
sb.Append("id='").Append(id).Append("' ");
}
if (value != null)
{
sb.Append("value='").Append(value.ToString()).Append("' ");
}
else
{
sb.Append("value='1' ");
}
if (min != null)
{
sb.Append("data-min='").Append(min).Append("' ");
}
if (max != null)
{
sb.Append("data-max='").Append(max).Append("' ");
}
if (step != null)
{
sb.Append("data-step='").Append(step).Append("' ");
}
if (rule != null)
{
sb.Append("data-rule='").Append(rule.ToString()).Append("' ");
}
else
{
sb.Append("data-rule='quantity' ");
}
sb.Append("/>");

sb.Append("");
sb.Append("");
sb.Append("");
sb.Append("
");

tag.InnerHtml = sb.ToString();

return MvcHtmlString.Create(tag.ToString());

}
}

public enum SpinningRule
{
defaults,currency,quantity,percent,month,day,hour,minute,second,}
}

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

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

代码如下:
Box(null,"1",1,10,2,null)

得到结果:

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

二、DateTimeBoxExtensions

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

1、初始方案

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

rush: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代码这样写

rush:xhtml;">

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

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

2、改进方案

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

rush: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"),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({},data || {});

$(item).datetimepicker(datetimedefault);
});
});

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

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

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

rush:csharp;"> using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc;

namespace BootstrapExtensions
{
public static class DateTimeBoxExtensions
{
///


/// 生成日期控件
///

/// <param name="html">扩展方法实例
/// <param name="id">文本框标签的id
/// 返回呈现日期控件的html标签
public static MvcHtmlString DateTimeBox(this BootstrapHelper html,string id)
{
return DateTimeBox(html,null);
}

///


/// 生成日期控件
///

/// <param name="html">扩展方法实例
/// <param name="id">文本框标签的id
/// <param name="value">文本框标签认值
/// 返回呈现日期控件的html标签
public static MvcHtmlString DateTimeBox(this BootstrapHelper html,object value)
{
return DateTimeBox(html,null);
}

///


/// 生成日期控件
///

/// <param name="html">扩展方法实例
/// <param name="id">文本框标签的id
/// <param name="value">文本框标签认值
/// <param name="format">显示日期的格式
/// <param name="maxDate">日期的最小值
/// <param name="minDate">日期的最大值
/// 返回呈现日期控件的html标签
public static MvcHtmlString DateTimeBox(this BootstrapHelper html,string format,string maxDate,string minDate)
{
return DateTimeBox(html,format,maxDate,minDate,null);
}

///


/// 生成日期控件
///

/// <param name="html">扩展方法实例
/// <param name="id">文本框标签的id
/// <param name="value">文本框标签认值
/// <param name="format">显示日期的格式
/// <param name="maxDate">日期的最小值
/// <param name="minDate">日期的最大值
/// <param name="viewmode">日期控件的浏览模式
/// <param name="showClear">是否显示清空按钮
/// 返回呈现日期控件的html标签
public static MvcHtmlString DateTimeBox(this BootstrapHelper html,string minDate,string viewmode,bool? showClear)
{
TagBuilder tag = new TagBuilder("div");
tag.MergeAttribute("class","input-group date");
if (!string.IsNullOrEmpty(format))
{
tag.MergeAttribute("data-format",format);
}
if (!string.IsNullOrEmpty(maxDate))
{
tag.MergeAttribute("data-maxDate",maxDate);
}
if (!string.IsNullOrEmpty(minDate))
{
tag.MergeAttribute("data-minDate",minDate);
}
if (!string.IsNullOrEmpty(viewmode))
{
tag.MergeAttribute("data-viewmode",viewmode);
}
if (showClear!=null)
{
tag.MergeAttribute("data-showClear",showClear.ToString());
}

System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("<input type='text' class='form-control'");
if(!string.IsNullOrEmpty(id))
{
sb.Append("id='").Append(id).Append("' ");
}
if (value != null)
{
sb.Append("value='").Append(value.ToString()).Append("' ");
}

sb.Append("/>").Append("")
.Append("")

.Append("");

tag.InnerHtml = sb.ToString();

return MvcHtmlString.Create(tag.ToString());
}
}
}

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

rush:xhtml;">

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐