• Net Core-Razor


    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>
                        }
                    }    
    复制代码

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

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

    @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>
    }
    }

    复制代码
        [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);
                }
            }
        }
    复制代码

    2. 在_ViewImports中添加TagHelper

    [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);
    }
    }
    }

    @addTagHelper *, YourNamespace

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

    @addTagHelper *, YourNamespace
    复制代码
    <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>
    复制代码

    全部是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社区迈出更大的一步!

  • 相关阅读:
    Oracle数据库内置函数
    软件测试工程师笔试题带答案
    JavaBean对象与Map对象互相转化
    Android之MVP模式实现登录和网络数据加载
    AndroidStudio使用偷懒插件Butterknife和GsonFormat
    最强 Android Studio 使用小技巧和快捷键
    android--------Retrofit+RxJava的使用
    Android之封装好的异步网络请求框架
    Android之MVC模式的使用
    Andriod的Http请求获取Cookie信息并同步保存,使第二次不用登录也可查看个人信息
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5538632.html
Copyright © 2020-2023  润新知