在编程中,常常有这样的需求:当某条件为真时,显示Html代码段A;条件为假时,显示代码段B。
如下所示:
@if (true)
{
<h1>条件为真</h1>
}
else
{
<h1>条件为假</h1>
}
现在,我就写了个自定义的TagHelpers,方便实现这种需求。格式如下:
<HF.gl selbool="true" > <h1>条件为真</h1> 【或】 <h1>条件为假</h1> </HF.gl>
selbool属性用来填写条件,“【或】”是分隔符。
把条件为真的代码填写在【或】前面,条件为假的代码发放在【或】后面。
这样就实现了第一段代码的功能。
可能有人要问,何必这么复杂,第一段代码不是挺好吗?
确实,第一段代码也很简单就实现了这个功能。下面我们对比一下
@if (Ones.uPermit("A06")) { <text>得到A06授权显示</text> } else { <text>未得到A06授权显示</text> } <HF.gl selbool=@Ones.uPermit("A06")>得到A06授权显示【或】未得到A06授权显示</HF.gl>
这样如何呢?是不是一句话代码看起来比较舒服?
还有,我们也会常用到switch,那我们在这个TagHelpers里面也加上这个功能吧。
如下:
<HF.gl selint="2" >第一段【或】第二段【或】第三段【或】第四段</HF.gl>
selint属性表示显示第几段的内容,上面这句运行结果就是:第二段
希望这个自定义的TagHelpers能给大家带来点帮助。
下面附上这段源码:
namespace HHFcoreTag.TagHelpers { [HtmlTargetElement("HF.gl")]//<HF.gl selbool="true" selint="2" >abc【或】def</HF.gl> [HtmlTargetElement(Attributes = nameof(Selbool))] [HtmlTargetElement(Attributes = nameof(Selint))] public class MyTagHelper : TagHelper { public bool Selbool { get; set; } public int Selint { get; set; } public override void Process(TagHelperContext context, TagHelperOutput output) { output.TagName = ""; var htmls = Regex.Split(output.GetChildContentAsync().Result.GetContent(), "【或】", RegexOptions.IgnoreCase); //不可同时使用两个条件 if (context.AllAttributes.ContainsName("selbool") == true &&context.AllAttributes.ContainsName("selint") == true) { output.Content.SetHtmlContent("<b><font color=#ff0000>错误:selbool、selint条件属性不可同时使用!</font></b>"); return; } //条件选择(布尔值) if (context.AllAttributes.ContainsName("selbool")) { if (Selbool == true) { output.Content.SetHtmlContent(htmls[0]); } else { if (htmls.Count() > 0) { output.Content.SetHtmlContent(htmls[1]); } else { output.Content.SetHtmlContent(""); } } } //条件选择(数字序号) if (context.AllAttributes.ContainsName("selint")) { if(Selint<= htmls.Count()&&Selint>=1) { output.Content.SetHtmlContent(htmls[Selint-1]); } else { output.Content.SetHtmlContent(""); } } } } }