TagHelpers 能够让服务端代码参与创建和渲染 HTML 元素,让整个View视图看起来只有Html代码,也让前台开发人员开发的页面直接被后台开发人员使用,而不需要重复的书写代码,这种设计将会成为主流,直接在Html元素上添加对应的标签即可,目前记录下自己遇见的问题(坑)及解决方法。我这边将TagHelper单独放在一个类库中。制作一个公共Select标签,自动填充Select选项。无需前段编写任何代码。
一.nuget引用 Microsoft.AspNetCore.Mvc
二.添加CriySelectTagHelper.cs 继承TagHelper (所有tagHelper扩展都必须继承 TagHelper) 源代码如下
几个比较容易出问题点:
1.[HtmlTargetElement("criyselect")] 设置前段使用的element名称(严格区分大小写,建议全部小写)
2.[HtmlAttributeName("data")]获取Html设置的属性值(如下图) 没有列出的HTML属性值系统自动添加上。所以这里只设置自己需要操作的属性即可
3.Process和ProcessAsync 为同步和异步加载数据。
namespace CoreExtends.Extends
{
[HtmlTargetElement("criyselect")]
public class CriySelectTagHelper : TagHelper
{
[HtmlAttributeName("data")]
public string Data { get; set; }
[HtmlAttributeName("class")]
public string _class { get; set; } = "form-control";
public override void Process(TagHelperContext context, TagHelperOutput output)
{
var db = DBConnect.db;
List<TSelectParamsEntity> list = db.Queryable<TSelectParamsEntity>().Where(t => t.FNo == Data).OrderBy(t => t.FOrder).ToList();
output.TagName = "select";
output.TagMode = TagMode.StartTagAndEndTag;
output.Attributes.SetAttribute("Data", Data);
output.Attributes.SetAttribute("class", _class);
string htmlstr = "";
if (list.Count > 0)
{
foreach (var item in list)
{
htmlstr += "<option value='" + item.FKey + "' >" + item.FValue + "</option>";
}
}
else
{
htmlstr = "<option value='-1' disabled=''>" + rs.SelectNodata + "</option>";
}
output.Content.SetHtmlContent(htmlstr);
}
}
}
三.cshtml页面使用标签
四.引入扩展的TagHelper 如果此步不成功或出错 上面所有操作都是白费~
我这边使用通用页面引用 写在_ViewImports.cshtml 写法如下
1.@using CoreExtends.Extends 扩展类所在命名空间。一定要写全部。多个TagHelper在不同命名空间 都要写入
2.@addTagHelper *,CoreExtends 我的理解是添加查找范围。*代表所有。后面跟类库名称。添加后可以在页面使用智能感知功能。如下
五.TagHelper有很多强大功能。慢慢探索吧~~