• Asp.Net Core-几行代码解决Razor中的嵌套if语句


    MVC开发中,经常会遇到在razor中插入简单的逻辑判断。 

                    @if (clientManager.IsAdmin)
                    {
                        if (!Model.Topic.Top)
                        {
                            <a asp-action="Top" asp-controller="Topic" asp-route-id="@Model.Topic.ID" class="btn btn-default btn-xs" title="置顶"><i class="fa fa-lg fa-star-o"></i> 置顶</a>
                        }
                        else
                        {
                            <a asp-action="Top" asp-controller="Topic" asp-route-id="@Model.Topic.ID" class="btn btn-success btn-xs" title="取消置顶"><i class="fa fa-lg fa-star"></i> 取消置顶</a>
                        }
                        if (!Model.Topic.Recommand)
                        {
                            <a asp-action="Recommand" asp-controller="Topic" asp-route-id="@Model.Topic.ID" class="btn btn-default btn-xs" title="加精华"><i class="fa fa-lg fa-heart-o"></i> 添加精华</a>
                        }
                        else
                        {
                            <a asp-action="Recommand" asp-controller="Topic" asp-route-id="@Model.Topic.ID" class="btn btn-success btn-xs" title="取消精华"><i class="fa fa-lg fa-heart"></i> 取消精华</a>
                        }
                    }    
    View Code

    代码嵌套在HTML中其实是很不好,同时也是很无奈的行为。这样会导致HTML不整洁,如果嵌套层次多了也会不好维护。在Asp.Net Core中,提供了TagHelper可以很方便的解决这个问题。关于TagHelper,大家可以参考官方文档

    1. 先定义一个叫VisibleTagHelper的类,代码如下

        [HtmlTargetElement(Attributes = "condition")]
        [HtmlTargetElement("visible")]
        public class VisibleTagHelper : TagHelper
        {
            [HtmlAttributeName("condition")]
            public bool Condition { get; set; }
    
            public override void Process(TagHelperContext context, TagHelperOutput output)
            {
                if (output.TagName == "visible")
                {
                    output.TagName = "";
                }
    
                if (!this.Condition)
                {
                    output.TagName = "";
                    output.Content.SetHtmlContent("");
                }
                else
                {
                    base.Process(context, output);
                }
            }
        }
    View Code

    2. 在_ViewImports中添加TagHelper

    @addTagHelper *, YourNamespace
    View Code

    3. 修改一下上面的Razor代码

    <visible condition="@clientManager.IsAdmin">
                        <a condition="@(!Model.Topic.Top)" asp-action="Top" asp-controller="Topic" asp-route-id="@Model.Topic.ID" class="btn btn-default btn-xs" title="置顶"><i class="fa fa-lg fa-star-o"></i> 置顶</a>
    
                        <a condition="@Model.Topic.Top" asp-action="Top" asp-controller="Topic" asp-route-id="@Model.Topic.ID" class="btn btn-success btn-xs" title="取消置顶"><i class="fa fa-lg fa-star"></i> 取消置顶</a>
    
                        <a condition="@(!Model.Topic.Recommand)" asp-action="Recommand" asp-controller="Topic" asp-route-id="@Model.Topic.ID" class="btn btn-default btn-xs" title="加精华"><i class="fa fa-lg fa-heart-o"></i> 添加精华</a>
    
                        <a condition="@Model.Topic.Recommand" asp-action="Recommand" asp-controller="Topic" asp-route-id="@Model.Topic.ID" class="btn btn-success btn-xs" title="取消精华"><i class="fa fa-lg fa-heart"></i> 取消精华</a>
                    </visible>
    View Code

    全部是HTML,没有了烦人的大括号,是不是清爽了很多!!

    那么再说会VisibleTagHelper,这个类主要做了什么操作呢?

    [HtmlTargetElement(Attributes = "condition")]
    [HtmlTargetElement("visible")]

    顶部的2个Attribute作为选择符,表示这个TagHelper在哪些HTML元素上生效。第一个Attribute表示在所有拥有condition属性的HTML元素生效,第二个Attribute表示在<visible>元素生效。

    [HtmlAttributeName("condition")]
    public bool Condition { get; set; }

    此TagHelper公布了一个bool类型的属性,作为是否显示内容的判断条件

    public override void Process(TagHelperContext context, TagHelperOutput output)
            {
                if (output.TagName == "visible")
                {
                    output.TagName = "";
                }
    
                if (!this.Condition)
                {
                    output.TagName = "";
                    output.Content.SetHtmlContent("");
                }
                else
                {
                    base.Process(context, output);
                }
            }

    通过重写TagHelper基类的Process方法,实现控制显示内容的逻辑。当Condition条件为false,则将TagHelper所应用的元素的HTML内容设置为空。

    仔细一想,这个和angularjs的directive何其相似。asp.net core集各种先进的思想为一身,又可以跨平台,真心希望它能带领.Net社区迈出更大的一步!

  • 相关阅读:
    WM_PAINT消息详解,使用InvalidateRect或InvalidateRgn函数刻意产生WM_PAINT消息(WIN7里有变化,“调整视觉效果”,将“启用桌面组合”去掉)
    delphi 大文件的读写 使用 MapviewOffile
    Delphi的子类化控件消息, 消息子类化
    wParam与lParam的区别
    为什么使用DLL
    大数据分包算法
    JSON如何序列图片
    AngularJs学习
    设计模式解读
    js模块化编程总结
  • 原文地址:https://www.cnblogs.com/scheshan/p/5528927.html
Copyright © 2020-2023  润新知