zoukankan      html  css  js  c++  java
  • 关于TagHelper的那些事情——如何自定义TagHelper(TagHelper基类)

    写在开头

    前面介绍了TagHelper的基本概念和内嵌的TagHelpers,想必大家对TagHelper都有一定的了解。TagHelper看上去有点像WebControl,但它不同于WebControl,没有复杂的生命周期、状态保持、服务器事件以及较高权限,它只能修改自己Tag的内容。有时觉得它更像angular写出来的一个widget,有自己特有的Tag,并对其进行解析生成出widget ui和启动脚本,但是它具有更高的权限,能访问服务器端信息。

    在这章,将要介绍如何自定义TagHelper,考虑到内容比较多,会分成几个小章节来介绍。

    TagHelper基类

    通过查看内嵌的TagHelpers的源码,发现这些TagHelpers都继承自Microsoft.AspNet.Razor.Runtime.TagHelpers.TagHelper抽象类,而这个类又实现了接口Microsoft.AspNet.Razor.Runtime.TagHelpers.ITagHelper。这个接口是TagHelper最底层的接口,

        /// <summary>
        /// Contract used to filter matching HTML elements.
        /// </summary>
        public interface ITagHelper
        {
            /// <summary>
            /// 获取实现ITagHelper接口的类的解析顺序.
            /// 值小的先用该类来解析。
            /// </summary>
            int Order { get; }
    
            /// <summary>
            /// 根据所给参数context和output异步解析实现ITagHelper的当前类.
            /// </summary>
            /// <param name="context">当前HTML Tag的相关信息</param>
            /// <param name="output">用于生成HTML Tag的HTML元素.</param>
            /// <returns>用于更新output的Task实例.</returns>
            Task ProcessAsync(TagHelperContext context, TagHelperOutput output);
        }
    

    TagHelper类,主要实现了上面接口,添加了一个同步方法来解析当前类,定义如下:

        /// <summary>
        /// Class used to filter matching HTML elements.
        /// </summary>
        public abstract class TagHelper : ITagHelper
        {
            public virtual int Order { get; } = 0;
    
            //同步解析当前TagHelper
            public virtual void Process(TagHelperContext context, TagHelperOutput output)
            {
            }
    
            //异步解析当前TagHelper
            public virtual async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
            {
                Process(context, output);
            }
        }
    

    一般自定义TagHelper时,只需要设计的类继承于TagHelper类,重载Process方法,根据context,设置output输出html元素和脚本即可。

    TagHelper类名

    自定义的TagHelper类名格式为***TagHelper,其中省略部分***就是该TagHelper应用的Tag。比如我们定义:

    public class MyTagHelper: TagHelper
    {
     ....   
    }
    

    那么页面上所有Tag是my都会进入到这个类来解析,注意Tag名要是小写。

    如果***中包括好几个大写字母,那么对于的Tag名是将大写字母变小写前面加上"-",如果大写字母在第一个位置,那么只需要改成小写,前面不需要加“-”。比如

    public class MyFirstOneTagHelper: TagHelper
    {
    ...
    }
    

    那么作用的Tag是

    <my-first-one ... ></my-first-one>
    

    我们还可以在类上添加TargetElementAttribute来设置作用的Tag,比如定义如下的类时,其作用的Tag名为my。

    [TargetElement("my")]
    public class MyFirstOneTagHelper: TagHelper
    {
    ...
    }
    

    待续...

      

  • 相关阅读:
    Visifire正式版(v1.1)发布
    [转]PSP机能强大!已能模拟运行WINDOWS系统?
    在Silverlight+WCF中应用以角色为基础的安全模式(一)基础篇之角色为基础的安全模式简介 Virus
    C#的加密解密算法,包括Silverlight的MD5算法 Virus
    MMORPG programming in Silverlight Tutorial (10)Implement the sprite’s 2D animation (Part IV)
    Game Script: Rescue Bill Gates
    MMORPG programming in Silverlight Tutorial (9)KeyFrame Animation
    MMORPG programming in Silverlight Tutorial (5)Implement the sprite’s 2D animation (Part II)
    MMORPG programming in Silverlight Tutorial (7)Perfect animation
    MMORPG programming in Silverlight Tutorial (3)Animate the object (Part III)
  • 原文地址:https://www.cnblogs.com/liontone/p/4644250.html
Copyright © 2011-2022 走看看