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

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

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

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

                @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的类,代码如下

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

    [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

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

@addTagHelper *, YourNamespace

View Code

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

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

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

转载于:https://www.cnblogs.com/scheshan/p/5528927.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109000.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • plsqldev怎么备份和还原数据库

    plsqldev怎么备份和还原数据库
    一、导出/导入(Export/Import)利用Export可将数据从数据库中提取出来,利用Import则可将提取出来的数据送回到Oracle数据库中去。1、简单导出数据(Export)和导入数据(Import):Oracle支持三种方式类型的输出:(1)、表方式(T方式),将指定表的数据导出。(2)、用户方式(U方式),将指定用户的所有对象及数据导出。(3)、全库方式(Full方式),瘵数据库中的所有对象导出。数据导

  • System.Data.SqlClient.SqlException_sqlserver substring截取字符串

    System.Data.SqlClient.SqlException_sqlserver substring截取字符串“System.Data.SqlClient.SqlException”类型的未经处理的异常在System.Data.dll中发生。其他信息:将截断字符串或二进制数据

  • FindWindowEx的应用

    FindWindowEx的应用HWND hWorker,hRebar,hComEx,hcom,hEdit;HWND hwndParent=::FindWindow("IEFrame",NULL);//找到IE窗口  char szError[260];hWorker=FindWindowEx(hwndParent,0,"WorkerA",NULL);//找到工作区窗口(不是internet e…

  • Vue生命周期钩子(三)「建议收藏」

    Vue生命周期钩子(三)「建议收藏」Vue生命周期图Vue中共有11个生命周期函数,本文只说明8个生命周期钩子beforeCreate:实例刚在内存中被创建出来,此时,还没有初始化好data和methods属性created:实例已经在内存中创建完毕,此时 data 和 methods 已经创建完毕,此时还没有开始编译模板beforeMount:此时已经完成了模板的编译,但是还没有挂载到页面中…

  • Mac 登录界面多了一个其它账户删除

    Mac 登录界面多了一个其它账户删除

    2021年12月16日
  • mysql 获取分区的最大值_MySQL分区表测试「建议收藏」

    mysql 获取分区的最大值_MySQL分区表测试「建议收藏」MYSQL分区表功能测试。1.查看Mysql版本是否支持分区SHOWVARIABLESLIKE’%partition%’;+——————-+——-+|Variable_name|Value|+——————-+——-+|have_partitioning|YES|+——————…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号