企业网站素材图片,做网站上面图片的软件,外贸营销方式有哪些,网站布局用什么代码众所周知#xff0c;在asp.net core中编写Razor视图的时候#xff0c;用了一种新的写法--TagHelper 那这个TagHelper是怎么回事呢? 首先来看看TagHelper的项目位置#xff0c;它是位于Microsoft.AspNetCore.Mvc.TagHelpers。 如果看到project.json#xff0c;可以发现在asp.net core中编写Razor视图的时候用了一种新的写法--TagHelper 那这个TagHelper是怎么回事呢? 首先来看看TagHelper的项目位置它是位于Microsoft.AspNetCore.Mvc.TagHelpers。 如果看到project.json可以发现它还依赖一个比较重要的东西Microsoft.AspNetCore.Mvc.Razor 为什么这么说呢其实很简单看了里面诸多TagHelper就会发现里面都是继承了 Microsoft.AspNetCore.Razor.TagHelpers下面的TagHelper这个抽象类。 下面就以我们天天用到的表单--FormTagHelper为例来说一下他是怎么实现的。 首先要看看TagHelper这个抽象类 public abstract class TagHelper : ITagHelper { protected TagHelper(); public virtual int Order { get; } public virtual void Init(TagHelperContext context); public virtual void Process(TagHelperContext context, TagHelperOutput output); public virtual Task ProcessAsync(TagHelperContext context, TagHelperOutput output); } 面包含两比较重要的方法Process和ProcessAsync 其实看方法名就应该知道一个是同步的方法一个是异步的方法 因为这个是输出html的方法你说这能不重要吗下面来看看FormTagHelper的具体实现吧 [HtmlTargetElement(form, Attributes ActionAttributeName)] 先来看看HtmlTargetElement这个Attribute是用来干嘛的 简单来说它指定了我们html标签(form/form)以及一些相关的元素。 可以看到诸多Attributes XXXAttributeName其中的XXXAttributeName是在类里面定义的变量。 private const string ActionAttributeName asp-action; private const string AntiforgeryAttributeName asp-antiforgery; private const string AreaAttributeName asp-area; private const string ControllerAttributeName asp-controller; private const string RouteAttributeName asp-route; private const string RouteValuesDictionaryName asp-all-route-data; private const string RouteValuesPrefix asp-route-; private const string HtmlActionAttributeName action; 再来看看下面的图相对比一看是不是就很清晰了呢 我们可以看到下面的好几个属性如Controller它的上面是有 HtmlAttributeName来标注的 而且这个指向的名字还是ControllerAttributeName(也就是asp-controller)。这个就是用来接收asp-controller的值。 [HtmlAttributeName(ControllerAttributeName)]public string Controller { get; set; } 相对来说这样做只是起了个别名。 [HtmlTargetElement(form, Attributes ActionAttributeName)] [HtmlTargetElement(form, Attributes AntiforgeryAttributeName)] [HtmlTargetElement(form, Attributes AreaAttributeName)] [HtmlTargetElement(form, Attributes ControllerAttributeName)] [HtmlTargetElement(form, Attributes RouteAttributeName)] [HtmlTargetElement(form, Attributes RouteValuesDictionaryName)] [HtmlTargetElement(form, Attributes RouteValuesPrefix *)] public class FormTagHelper : TagHelper 当然我们也是可以不指定别名的也可以不用在HtmlTargetElement指明Attributes 好比如下的代码就可以直接用Controller [HtmlTargetElement(form)] public class FormTagHelper : TagHelper { public string Controller { get; set; } } 还有一个RouteValues的属性它是一个键值对用来存放参数的具体可以怎么用呢 总的来说有两种用法。可以看到它指向asp-all-route-data和asp-route- 1 [HtmlAttributeName(RouteValuesDictionaryName, DictionaryAttributePrefix RouteValuesPrefix)] 用法如下一种是用asp-all-route-data来接收一个IDictionary类型的变量一种是通过asp-route-*的方式来接收参数*的值。 这两种写法是等价的。 下面就是FormTagHelper的构造函数和一个Generator属性 public FormTagHelper(IHtmlGenerator generator) { Generator generator; } protected IHtmlGenerator Generator { get; } 由于在Core中依赖注入随处可见看到这个写法马上就是想到了这个 果不其然发现其对应了一个实现类DefaultHtmlGenerator。 public class DefaultHtmlGenerator : IHtmlGenerator { public DefaultHtmlGenerator(IAntiforgery antiforgery, IOptionsMvcViewOptions optionsAccessor, IModelMetadataProvider metadataProvider, IUrlHelperFactory urlHelperFactory, HtmlEncoder htmlEncoder, ClientValidatorCache clientValidatorCache); public virtual TagBuilder GenerateActionLink(ViewContext viewContext, string linkText, string actionName, string controllerName, string protocol, string hostname, string fragment, object routeValues, object htmlAttributes); public virtual IHtmlContent GenerateAntiforgery(ViewContext viewContext); public virtual TagBuilder GenerateForm(ViewContext viewContext, string actionName, string controllerName, object routeValues, string method, object htmlAttributes); public virtual TagBuilder GenerateLabel(ViewContext viewContext, ModelExplorer modelExplorer, string expression, string labelText, object htmlAttributes); public virtual TagBuilder GenerateTextArea(ViewContext viewContext, ModelExplorer modelExplorer, string expression, int rows, int columns, object htmlAttributes); public virtual TagBuilder GenerateTextBox(ViewContext viewContext, ModelExplorer modelExplorer, string expression, object value, string format, object htmlAttributes); protected virtual TagBuilder GenerateInput(ViewContext viewContext, InputType inputType, ModelExplorer modelExplorer, string expression, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, string format, IDictionarystring, object htmlAttributes); protected virtual TagBuilder GenerateLink(string linkText, string url, object htmlAttributes); ....省略部分 } 这个类里面我们看到了熟悉的TagBuilder就算不去看它里面的实现都能知道它是用来干嘛的 它就是用来创建我们的Html标签相信用过MVC的多多少少都扩展过HtmlHelper这是类似的。 最后也是最最重要的重写的Process方法。 可以看到开始就判断了表单form中是否包含了action这个属性output.Attributes.ContainsName(HtmlActionAttributeName) 如果包含就是正常的html标签。换句话说正常的html写法和我们的TagHelper方法会有冲突只能用其中一种。 当我们这样写的时候编译能通过。 但是运行的时候就会出错。 再下面的处理就是用了TagBuilder去处理了。 收集路由的数据放到一个字典中-区域是否存在-用Generator去创建form表单返回TagBuilder对象-TagHelperOutput对象把tagbuilder的innerhtml等信息输出。 如下面的写法 1 form methodpost asp-actionGet asp-controllerProduct asp-antiforgeryfalse asp-route-id22 button typesubmitsubmit/button3 /form 生成对应的html如下 1 form methodpost action/Product/Get/22 button typesubmitsubmit/button3 /form 到这里FormTagHelper的讲解就算是OK至于其他的原理都是差不多就不再累赘了。 来看看到底有多少种TagHelper(还没有部分没有列出来)以及它们包含的属性。 下面是我们自己写一个TagHelper——CatcherATagHelper这个TagHelper是干什么的呢它只是一个精简版的A标签。 using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Mvc.TagHelpers; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Razor.TagHelpers; namespace Catcher.EasyDemo.Controllers.TagHelpers { [HtmlTargetElement(catcher-a)] public class CatcherATagHelper:TagHelper { public CatcherATagHelper(IHtmlGenerator generator, IUrlHelperFactory urlHelperFactory) { this.Generator generator; UrlHelperFactory urlHelperFactory; } [HtmlAttributeNotBound] public IUrlHelperFactory UrlHelperFactory { get; } protected IHtmlGenerator Generator { get; } public override int Order { get { return -1000; } } public string Action { get; set; } public string Controller { get; set; } public string LinkText { get; set; } [ViewContext] [HtmlAttributeNotBound] public ViewContext ViewContext { get; set; } public override void Process(TagHelperContext context, TagHelperOutput output) { //method 1 if (Action ! null || Controller ! null) { output.Attributes.Clear(); var urlHelper UrlHelperFactory.GetUrlHelper(ViewContext); output.TagName a; output.Attributes.SetAttribute(href, urlHelper.Action(Action, Controller)); //whether the inner html is null if (output.Content.IsEmptyOrWhiteSpace) { output.PreContent.SetContent(LinkText); } } //method 2 //TagBuilder tagBuilder; //if (Action ! null || Controller ! null) //{ // tagBuilder Generator.GenerateActionLink( // ViewContext, // linkText: string.Empty, // actionName: Action, // controllerName: Controller, // protocol: string.Empty, // hostname: string.Empty, // fragment: string.Empty, // routeValues: null, // htmlAttributes: null); // output.TagName a; // //whether the inner html is null // if (output.Content.IsEmptyOrWhiteSpace) // { // output.PreContent.SetContent(LinkText); // } // output.MergeAttributes(tagBuilder); //} } } } 这里提供了两种写法供大家参考 一种是借助IUrlHelperFactory去生成链接 一种是借助IHtmlGenerator去生成链接 写好了之后要怎么用呢 不知道大家有没有留意_ViewImports.cshtml这个文件 1 using Catcher.EasyDemo.Website2 addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers3 inject Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration TelemetryConfiguration 这个是默认情况下帮我们添加的TagHelper 我们可以在要用到那个TagHelper的地方添加就好 { Layout null; }addTagHelper Catcher.EasyDemo.Controllers.TagHelpers.CatcherATagHelper , Catcher.EasyDemo.Controllers catcher-a actionlist controllerproduct link-texttextWith LinkText And InnerHtml/catcher-abr /catcher-a actionlist controllerproduct link-textWithout LinkText/catcher-a br /catcher-a actionlist controllerproduct link-textOnly With LinkText/catcher-a addTagHelper的用法如下 addTagHelper 你的TagHelper , 你的TagHelper所在的命名空间 或者更直接 addTagHelper * , 你的TagHelper所在的命名空间 可以添加当然也可以删除删除是removeTagHelper 当我们在自己的框架中完全重写了一套自己的TagHelper那么这个时候微软自己的TagHelper我们就可以通过下面的方法来移除了。 removeTagHelper * , Microsoft.AspNetCore.Mvc.TagHelpers 原文地址http://www.cnblogs.com/catcher1994/p/5790720.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注