【问题标题】:Instantiating and Invoking TagHelpers Manually手动实例化和调用 TagHelper
【发布时间】: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


    【解决方案1】:

    您好,我正在处理这个问题,但您被困在 ViewContext 和输出中。 我做过一个类似的项目。这是代码,希望对您有所帮助。

    [HtmlTargetElement(ParentAnchorTag)]
    public class ParentActionTagHelper : TagHelper
    {
        private const string ParentAnchorTag = "p-a";
    
        [HtmlAttributeNotBound]
        [ViewContext]
        public ViewContext viewContext { get; set; }
    
        private readonly IHtmlGenerator _htmlGenerator;
    
        public ParentActionTagHelper(IHtmlGenerator htmlGenerator)
        {
            _htmlGenerator = htmlGenerator;
        }
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            output.TagName = "div";
    
            var anchorTagHelper = new AnchorTagHelper(_htmlGenerator)
            {
                Action = "Privacy",
                ViewContext = viewContext,
    
            };
            var anchorOutput = new TagHelperOutput("a", new TagHelperAttributeList(),
                (useCachedResult, encoder) =>  Task.Factory.StartNew<TagHelperContent>(
                     () => new DefaultTagHelperContent()));
            anchorOutput.Content.AppendHtml("Privacy Link");
            var anchorContext = new TagHelperContext(
                new TagHelperAttributeList(new[]
                {
                    new TagHelperAttribute("asp-action", new HtmlString("Privacy"))
                }),
                    new Dictionary<object, object>(),
                    Guid.NewGuid().ToString());
    
            anchorTagHelper.ProcessAsync(anchorContext, anchorOutput).GetAwaiter().GetResult();
            output.Content.SetHtmlContent(anchorOutput);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 2013-05-12
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 2011-01-05
      • 1970-01-01
      相关资源
      最近更新 更多