- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 ASP.NET Core 3.0 Web 应用程序中,我添加了以下简单的标记帮助器:
[HtmlTargetElement("submit-button")]
public class SubmitButtonTagHelper : TagHelper
{
public string Title { get; set; } = "Submit";
public string Classes { get; set; }
public string Id { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.Content.SetHtmlContent(
$@"<span class=""btn btn-primary {Classes}"" id=""{Id}"">{Title}</span>");
}
}
我打算这样使用:
<submit-button></submit-button>
但是,添加 SubmitButtonTagHelper 而不尝试使用它的行为会导致以下运行时异常:
InvalidOperationException: RenderBody has not been called for the page at '/Views/Shared/_Layout.cshtml'. To ignore call IgnoreBody().
我通过将此行添加到 Pages/_ViewImports.cshtml 文件中来导入标签助手:
@addTagHelper *, Web
我的 _Layout.cshtml 页面如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title><vc:product-name></vc:product-name> @ViewData["Title"]</title>
@RenderSection("Styles", required: false)
<partial name="_FrameworkStyles" />
</head>
<body class="top-navigation">
<div id="wrapper">
<div id="page-wrapper" class="gray-bg">
<div class="">
<vc:Navigation></vc:Navigation>
@RenderBody()
<div class="footer"></div>
</div>
</div>
</div>
<partial name="_FrameworkScripts" />
@RenderSection("Scripts", required: false)
</body>
</html>
我这里怎么出错了?在调试时,我可以看到 SubmitButtonTagHelper 中遇到了断点,但我还没有在任何地方引用它?据我了解, [HtmlTargetElement] 属性意味着它仅适用于元素标记为“提交按钮”的地方。这不正确吗?
我的项目中还有另一个标签助手,我还注意到该类中的断点也在我没有引用它的地方被命中。
我确实做了一些愚蠢的事情,但是什么?
最佳答案
ASP.NET Core MVC 有 Tag Helper Components 的概念:
A Tag Helper Component is a Tag Helper that allows you to conditionally modify or add HTML elements from server-side code.
...
Tag Helper Components don't require registration with the app in _ViewImports.cshtml.
...
Two common use cases of Tag Helper Components include:
同样来自文档,这里是标签帮助器组件的实现:
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
的内容元素, body 当然会失去它的RenderBody
指令。
所以,这是对如果 SubmitButtonTagHelper
可能发生的情况的详细解释。已注册为标签帮助器组件。毫不奇怪,这正是您上传到 GitHub ( source ) 的示例中所发生的情况:
private static void WebRegistration(ContainerBuilder builder)
{
builder.RegisterAutowiredAssemblyInterfaces(Assembly.Load(Web));
builder.RegisterAutowiredAssemblyTypes(Assembly.Load(Web));
}
我对Autofac了解不多,但是很明显,对RegisterAutowiredAssemblyInterfaces
的调用如上所示找到 SubmitButtonTagHelper
并将其注册到其所有接口(interface),包括 ITagHelperComponent
.
同样,我对 Autofac 了解不多,但最终,不打算作为标记帮助程序组件运行的标记帮助程序应该被排除在此自动注册过程之外。以下是关于如何进行此过滤的建议,尽管我认为这是一种糟糕的 Autofac 方法:
builder.RegisterAutowiredAssemblyInterfaces(Assembly.Load(Web))
.Where(x => !x.Name.EndsWith("TagHelper"));
关于c# - 添加简单的 TagHelper 会导致此错误 : "RenderBody has not been called for the page ",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59918819/
我正在尝试使用 Spark 从 Cassandra 读取数据。 DataFrame rdf = sqlContext.read().option("keyspace", "readypulse
这是代码: void i_log_ (int error, const char * file, int line, const char * fmt, ...) { /* Get erro
我必须调试一个严重依赖 Gtk 的程序。问题是由于某些原因,在使用 GtkWindow 对象时开始出现许多运行时警告。问题是,即使 Gtk 提示严重错误,它也不会因这些错误而中止。我没有代码库的更改历
我正在尝试从已有效编译和链接的程序中检索二进制文件。我已经通过 GL_PROGRAM_BINARY_LENGTH 收到了它的长度。该文档说有两个实例可能会发生 GL_INVALID_OPERATION
我有一个托管在 Azure 环境中的服务。我正在使用控制台应用程序使用该服务。这样做时,我得到了异常: "The requested service, 'http://xxxx-d.yyyy.be/S
我有以下代码,它被 SEGV 信号杀死。使用调试器表明它被 main() 中的第一个 sem_init() 杀死。如果我注释掉第一个 sem_init() ,第二个会导致同样的问题。我试图弄清楚是什么
目前我正在编写一个应用程序(目标 iOS 6,启用 ARC),它使用 JSON 进行数据传输,使用核心数据进行持久存储。 JSON 数据由 PHP 脚本通过 json_encode 从 MySQL 数
我对 Xamarin.Forms 还是很陌生。我在出现的主页上有一个非常简单的功能 async public Task BaseAppearing() { if (UserID
这是我的代码的简化版本。 public class MainActivity extends ActionBarActivity { private ArrayList entry = new Arr
我想弄明白为什么我的两个 Java 库很难很好地协同工作。这是场景: 库 1 有一个类 A,其构造函数如下: public A(Object obj) { /* boilerplate */ } 在以
如果网站不需要身份验证,我的代码可以正常工作,如果需要,则在打印“已创建凭据”后会立即出现 EXC_BAD_ACCESS 错误。我不会发布任何内容,并且此代码是直接从文档中复制的 - 知道出了什么问题
我在使用 NSArray 填充 UITableView 时遇到问题。我确信我正在做一些愚蠢的事情,但我无法弄清楚。当我尝试进行简单的计数时,我得到了 EXC_BAD_ACCESS,我知道这是因为我试图
我在 UITableViewCell 上有一个 UITextField,在另一个单元格上有一个按钮。 我单击 UITextField(出现键盘)。 UITextField 调用了以下方法: - (BO
我有一个应用程序出现间歇性崩溃。崩溃日志显示了一个堆栈跟踪,这对我来说很难破译,因此希望其他人看到了这一点并能为我指出正确的方向。 基本上,应用程序在启动时执行反向地理编码请求,以在标签中显示用户的位
我开发了一个 CGImage,当程序使用以下命令将其显示在屏幕上时它工作正常: [output_view.layer performSelectorOnMainThread:@selector(set
我正在使用新的 EncryptedSharedPreferences以谷歌推荐的方式上课: private fun securePrefs(context: Context): SharedPrefe
我有一个中继器,里面有一些控件,其中一个是文本框。我正在尝试使用 jquery 获取文本框,我的代码如下所示: $("#").click(function (event) {}); 但我总是得到 nu
在以下场景中观察到 TTS 初始化错误,太随机了。 已安装 TTS 引擎,存在语音集,并且可以从辅助功能选项中播放示例 tts。 TTS 初始化在之前初始化和播放的同一设备上随机失败。 在不同的设备(
maven pom.xml org.openjdk.jol jol-core 0.10 Java 类: public class MyObjectData { pr
在不担心冲突的情况下,可以使用 MD5 作为哈希值,字符串长度最多为多少? 这可能是通过为特定字符集中的每个可能的字符串生成 MD5 哈希来计算的,长度不断增加,直到哈希第二次出现(冲突)。没有冲突的
我是一名优秀的程序员,十分优秀!