ASP. NET Ядро MVC имеет концепцию Компоненты помощника по тегам :
Компонент помощника по тегам - это помощник по тегам, который позволяет вам условно изменить или добавить HTML элементов из серверного кода.
...
Tag Helper Компоненты не требуют регистрации в приложении в _ViewImports.cs html.
...
Два распространенных варианта использования компонентов-помощников тегов:
- Ввод в .
- Внедрение в .
Также из документов приведена реализация тега Вспомогательный компонент:
public class AddressStyleTagHelperComponent : TagHelperComponent
{
private readonly string _style =
@"<link rel=""stylesheet"" href=""/css/address.css"" />";
public override int Order => 1;
public override Task ProcessAsync(TagHelperContext context,
TagHelperOutput output)
{
if (string.Equals(context.TagName, "head",
StringComparison.OrdinalIgnoreCase))
{
output.PostContent.AppendHtml(_style);
}
return Task.CompletedTask;
}
}
Как только это будет зарегистрировано (показано далее), AddressStyleTagHelperComponent
будет выполняться дважды: один раз для элемента head
; один раз для элемента body
. Вот как он зарегистрирован в DI:
services.AddTransient<ITagHelperComponent, AddressScriptTagHelperComponent>();
В этот момент (или, возможно, даже раньше) вы, вероятно, думаете, что я сошел с ума. Какое отношение это имеет к SubmitButtonTagHelper
?
Через дерево наследования SubmitButtonTagHelper
в итоге реализует ITagHelperComponent
. Если вы добавите следующую регистрацию DI, SubmitButtonTagHelper
будет работать как компонент поддержки тегов, один раз для head
и один раз для body
:
services.AddTransient<ITagHelperComponent, SubmitButtonTagHelper>();
SubmitButtonTagHelper
разрушительный, заменяя все содержимое элемента, на котором он работает. Если бы он заменил содержимое элемента body
, тело, конечно, потеряло бы свою директиву RenderBody
.
Итак, это длинное объяснение того, что может произойти если SubmitButtonTagHelper
были зарегистрированы в качестве компонента Tag Helper. Не должно быть слишком удивительно, что именно это происходит в примере, который вы загрузили на GitHub ( source ):
private static void WebRegistration(ContainerBuilder builder)
{
builder.RegisterAutowiredAssemblyInterfaces(Assembly.Load(Web));
builder.RegisterAutowiredAssemblyTypes(Assembly.Load(Web));
}
Не знаю Я знаю много об Autofa c, но ясно, что вызов RegisterAutowiredAssemblyInterfaces
, показанный выше, находит SubmitButtonTagHelper
и регистрирует его для всех его интерфейсов, включая ITagHelperComponent
.
Опять же, я не много знаю об Autofa c, но, в конечном итоге, помощники по тегам, которые не предназначены для работы в качестве компонентов-помощников по тегам, должны быть исключены из процесса автоматической регистрации. Вот предложение о том, как сделать эту фильтрацию, хотя я ожидаю, что это ужасный подход Autofa c:
builder.RegisterAutowiredAssemblyInterfaces(Assembly.Load(Web))
.Where(x => !x.Name.EndsWith("TagHelper"));