【发布时间】:2019-02-07 21:18:53
【问题描述】:
这是this question 的后续问题,这似乎是针对较旧的 ASP.NET Core 版本(我使用的是 2.1)。
我正在尝试从 TagHelper 中手动调用 TagHelper。应用上面链接问题中的答案,TagHelper.Process 看起来像这样:
public override async void Process(TagHelperContext context, TagHelperOutput output)
{
var anchorTagHelper = new AnchorTagHelper
{
Action = "Home",
};
var anchorOutput = new TagHelperOutput("a", new TagHelperAttributeList(), (useCachedResult, encoder) => new HtmlString());
var anchorContext = new TagHelperContext(
new TagHelperAttributeList(new[] { new TagHelperAttribute("asp-action", new HtmlString("Home")) }),
new Dictionary<object, object>(),
Guid.NewGuid());
await anchorTagHelper.ProcessAsync(anchorContext, anchorOutput);
output.Content.SetHtmlContent(anchorOutput);
}
此时会出现几个编译器错误。
无法从“System.Guid”转换为“字符串”
没问题,我可以转换为字符串。
没有给出与所需形式相对应的参数 'HtmlString.HtmlString(string) 的参数'值'
检查 TagHelperOutput constructor 的 MSDN 页面,似乎不再需要 HtmlString。
我将该参数更改为委托函数:
new TagHelperOutput("a", new TagHelperAttributeList(),
(useCachedResult, encoder) => Task.Factory.StartNew<TagHelperContent>(
() => new DefaultTagHelperContent()));
最后一次编译错误:
没有给出与所需形式相对应的参数 参数“生成器”的 'AnchorTagHelper.AnchorTagHelper(IHtmlGenerator)
希望它是一个可选参数,我传入了null:
var anchorTagHelper = new AnchorTagHelper(null);
它终于编译了——但这导致运行时出现空指针异常:
Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper.Process(TagHelperContext 上下文,TagHelperOutput 输出)
因此,我的问题是:如何实例化 AnchorTagHelper,以便可以在 C# 中手动调用 TagHelpers?
编辑:我使用了 IHtmlGenerator 并得到了更有意义的错误消息:
private IHtmlGenerator htmlGenerator;
public myAnchorTagHelper(IHtmlGenerator htmlGenerator) {
this.htmlGenerator = htmlGenerator;
}
值不能为空。参数名称:viewContext>
Microsoft.AspNetCore.Mvc.ViewFeatures.DefaultHtmlGenerator.GenerateActionLink(ViewContext viewContext、字符串链接文本、字符串 actionName、字符串 控制器名称,字符串协议,字符串主机名,字符串片段, 对象 routeValues,对象 htmlAttributes)在 Microsoft.AspNetCore.Mvc.TagHelpers.AnchorTagHelper.Process(TagHelperContext 上下文,TagHelperOutput 输出)在 EAGLEweb2020.Models.EAGLEinputTagHelper.Process(TagHelperContext 上下文,TagHelperOutput 输出)在 C:\Users\1135937\source\repos\EAGLEweb2020\EAGLEweb2020\Models\TagHelpers\EAGLEinputTagHelper.cs:line 66 在 Microsoft.AspNetCore.Razor.TagHelpers.TagHelper.ProcessAsync(TagHelperContext 上下文,TagHelperOutput 输出)在 Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperRunner.d__0.MoveNext()
但是我怎样才能 DI 一个 ViewContext?
编辑 2:
原来 ViewContext 是 AnchorTagHelper 中的公共属性:
AnchorTagHelper inputTagHelper = new AnchorTagHelper(htmlGenerator);
inputTagHelper.ViewContext = viewContext;
但是现在内容是空的……
【问题讨论】:
标签: c# razor asp.net-core dependency-injection asp.net-core-tag-helpers