.Net Core 表单组件封装-TagHelper
在表单中会有大量的HTML元素会重复,包括样式,数据绑定等等,通过TagHelper来进行自定义的封装
这里以LayUI的日期控件举例,
![](https://img2020.cnblogs.com/blog/783110/202111/783110-20211127204138850-1699947856.png)
官网的日期控件使用:
1. <div class="layui-inline"> <!-- 注意:这一层元素并不是必须的 --> 2. <input type="text" class="layui-input" id="test1"> 3. </div> 4. <script src="/static/build/layui.js"></script> 5. <script> 6. layui.use('laydate', function(){ 7. var laydate = layui.laydate; 8. //执行一个laydate实例 9. laydate.render({ 10. elem: '#test1' //指定元素 11. }); 12. }); 13. </script>
封装后的代码量
<form:DateTime name="CreateTime" is-now="true"></form:DateTime>
步骤如下:
1.创建DateTimeTagHelper类
1 [HtmlTargetElement("form:DateTime")] 2 /// <summary> 3 /// 日期控件 4 /// </summary> 5 public class DateTimeTagHelper : TagHelper 6 { 7 /// <summary> 8 /// 控件Name 9 /// </summary> 10 public string Name { get; set; } 11 /// <summary> 12 /// 是否显示当前时间 13 /// </summary> 14 public bool IsNow { get; set; } 15 public override void Process(TagHelperContext context, TagHelperOutput output) 16 { 17 output.TagName = "input"; 18 output.Attributes.Add("type", "text"); 19 output.Attributes.Add("class", "layui-input"); 20 output.Attributes.Add("id", Name); 21 output.Attributes.Add("name", Name); 22 output.Attributes.Add("placeholder", "yyyy-MM-dd"); 23 if (IsNow) 24 { 25 output.Attributes.Add("value", DateTime.Now.ToString("yyyy-MM-dd")); 26 } 27 output.TagMode = TagMode.StartTagAndEndTag; 28 output.PostElement.SetHtmlContent($@" 29 30 <script> 31 layui.use('laydate', function(){{ 32 var laydate = layui.laydate; 33 34 //执行一个laydate实例 35 laydate.render({{ 36 elem: '#{Name}' //指定元素 37 ,change:function(value){{ 38 $('#{Name}').val(value); 39 }} 40 }}); 41 }}); 42 </script>"); 43 } 44 }
HtmlTargetElement:标签的名称
Attributes:定义用于选择匹配应用元素的属性
PostElement.SetHtmlContent:增加需要的HTML元素
2.在_ViewImports.cshtml注册DateTimeTagHelper
@using NetCoreFrame.WebUI @using NetCoreFrame.WebUI.Models @addTagHelper "NetCoreFrame.WebUI.TagHelpers.DateTimeTagHelper,NetCoreFrame.WebUI"
3.使用 注册成功后,标签的字体会变粗
![](https://img2020.cnblogs.com/blog/783110/202111/783110-20211127204138960-1954884676.png)
1 <div class="layui-inline"> 2 <label class="layui-form-label">发布日期</label> 3 <div class="layui-input-block"> 4 <form:DateTime name="CreateTime" is-now="true"></form:DateTime> 5 </div> 6 </div>