NameAndIdProvider не находит ссылки в контексте класса — ASP.NET Ядро MVC

#c# #asp.net-core #asp.net-core-mvc #asp.net-core-tag-helpers

#c# #asp.net-ядро #asp.net-core-mvc #asp.net-core-tag-помощники

Вопрос:

Мне нужно создать пользовательскую реализацию для поля ввода, поэтому я создал следующий класс:

 [HtmlTargetElement("input", Attributes = "tm-for", TagStructure = TagStructure.WithoutEndTag)]
public class TmInputTagHelper : InputTagHelper
{
    
    public TmInputTagHelper(IHtmlGenerator generator) : base(generator)
    {            
    }

    [HtmlAttributeName("tm-for")]
    public ModelExpression TmFor
    {
        get => For;
        set => For = value;
    }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        base.Process(context, output);


        string fullName = NameAndIdProvider.GetFullHtmlFieldName(ViewContext, For.Name);

        if (ViewContext.ViewData.ModelState.TryGetValue(fullName, out var entry) amp;amp; entry.Errors.Count > 0)
        {
            output.AddClass("is-invalid", HtmlEncoder.Default);
            output.RemoveClass("input-validation-error", HtmlEncoder.Default);
        }
    }
}
 

Однако я не могу найти ссылку для этого класса: NameAndIdProvider:

 string fullName = NameAndIdProvider.GetFullHtmlFieldName(ViewContext, For.Name);
 

У меня есть следующие варианты использования:

 using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using System.Text.Encodings.Web;
 

Ну, я больше не знаю, как я могу пройти мимо этого!

Ответ №1:

Вы можете использовать asp.net core 3 или выше, но NameAndIdProvider — это сборка ниже 2.2, которая является исходным кодом.

Область действия Internal ограничена определенной сборкой, но сборка здесь другая, поэтому на нее нельзя ссылаться. Лучший способ — настроить эту функцию в текущем проекте в соответствии с приведенным выше GetFullHtmlFieldName .