Asp.net core mvc MVC6标记帮助器作为编辑器模板的替代品

Asp.net core mvc MVC6标记帮助器作为编辑器模板的替代品,asp.net-core-mvc,tag-helpers,Asp.net Core Mvc,Tag Helpers,MVC6引入了标记帮助程序,作为@Html.EditorFor的更好替代。可以创建自定义编辑器模板。还可以创建自定义标记辅助对象 但是,在创建标记助手时,HTML需要通过C#代码(使用TagBuilder等)创建。对于复杂的标记帮助程序,它不如使用Razor语法方便 有什么方法可以让我从Razor页面创建自定义标记帮助器吗?TagHelpers的妙处在于,可以以多种不同的方式混合使用C和Razor。假设您有一个自定义剃须刀模板,例如: CustomTagHelperTemplate.cshtml

MVC6引入了标记帮助程序,作为@Html.EditorFor的更好替代。可以创建自定义编辑器模板。还可以创建自定义标记辅助对象

但是,在创建标记助手时,HTML需要通过C#代码(使用TagBuilder等)创建。对于复杂的标记帮助程序,它不如使用Razor语法方便


有什么方法可以让我从Razor页面创建自定义标记帮助器吗?

TagHelpers的妙处在于,可以以多种不同的方式混合使用C和Razor。假设您有一个自定义剃须刀模板,例如:

CustomTagHelperTemplate.cshtml

@模型用户
用户名:@Model.name

用户id:@Model.id

你有一个模型:

命名空间WebApplication1
{
公共类用户
{
公共字符串名称{get;set;}
公共int Id{get;set;}
}
}
以及
TagHelper

使用System.IO;
使用System.Threading.Tasks;
使用Microsoft.AspNet.Mvc;
使用Microsoft.AspNet.Mvc.Rendering;
使用Microsoft.AspNet.Razor.Runtime.TagHelpers;
使用Microsoft.Framework.WebEncoders;
命名空间WebApplication1
{
公共类UserTagHelper:TagHelper
{
私有只读HtmlHelper\u HtmlHelper;
专用只读IHtmlEncoder\u htmlEncoder;
公共用户TagHelper(IHtmlHelper htmlHelper、IHtmlEncoder HTMLNCODER)
{
_htmlHelper=htmlHelper作为htmlHelper;
_htmlEncoder=htmlEncoder;
}
[查看上下文]
公共视图上下文视图上下文
{
设置
{
_htmlHelper.上下文化(值);
}
}
公共字符串名称{get;set;}
公共int Id{get;set;}
公共重写异步任务ProcessAsync(TagHelperContext上下文,TagHelperOutput输出)
{
output.TagName=null;
output.SelfClosing=false;
var partial=WAIT_htmlHelper.PartialAsync(
“CustomTagHelperTemplate”,
新用户
{
Name=Name,
Id=Id
});
var writer=新的StringWriter();
部分。写入到(写入者,_htmlEncoder);
output.Content.SetContent(writer.ToString());
}
}
}
然后,您可以编写以下页面:

@addTagHelper“*,WebApplication1”
由此产生:

用户名:John Doe

用户id:1234


所以HTML帮助程序实际上并没有被弃用,而是由标记帮助程序进行补充?我自己说得再好不过了!是:)是否可以从我的页面提供模型(用户),比如说我的主模型的子模型,而不是在标记帮助器类的ProcessAsync方法中实例化它?这在ASP.NET Core 1.1中不起作用。我在您说partial.WriteTo(writer,_htmlEncoder)的行中得到一个错误,因为WriteTo需要System.Text.Encodings.Web.htmlEncoder而不是Microsoft.Extensions.WebEncoders.IHTMLEncoder。如果您对此进行注释并尝试运行它,则会出现InvalidOperationException:在尝试激活“UserTagHelper”时,无法解析类型为“Microsoft.Extensions.WebEncoders.IHtmlEncoder”的服务。这让我想起ASP.NET Web Forms days,其中