如何将ViewDataDictionary或ModelStateDictionary注入TagHelper?

Mar*_*mro 3 c# asp.net-core asp.net-core-tag-helpers

在剃刀视图中,我可以访问模型状态对象:

@ViewData.ModelState
Run Code Online (Sandbox Code Playgroud)

我如何在剃须刀中注射和访问ViewDataModelState对象TagHelper?我尝试了以下,但是ViewData并且ModelState始终为null:

public class ModelStateTagHelper : TagHelper
{
    public ViewDataDictionary ViewData { get; set; }
    public ModelStateDictionary ModelState { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

Ren*_*ers 9

对于那些寻找ViewData而不是那些的人ModelState,你可以添加ViewContext到你的TagHelper.

public class EmailTagHelper : TagHelper
{
    [ViewContext]
    public ViewContext ViewContext { get; set; }

    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        var hasACertainKey = this.ViewContext.ViewData.ContainsKey("ACertainKey");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这就是我们想要的答案 (2认同)

ade*_*lin 5

您可以注入IActionContextAccessor

    public void ConfigureServices(IServiceCollection services)
    {
        //...
        services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
    }

    public class ModelStateTagHelper : TagHelper
    {
        public readonly IActionContextAccessor _accessor;

        public ModelStateTagHelper(IActionContextAccessor accessor)
        {
            _accessor = accessor;
        }
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            var modelState = _accessor.ActionContext.ModelState;
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 这给出了模型状态,但是ViewData呢? (2认同)