有没有办法让TagHelper呈现另一个TagHelper?
TagHelpers示例;
public class OuterTagHelper : TagHelper
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "";
output.Content.SetContent("Hello <inner></inner>");
}
}
public class InnerTagHelper : TagHelper
{
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "";
output.Content.SetContent("World!");
}
}
Run Code Online (Sandbox Code Playgroud)
示例视图;
<outer></outer>
Run Code Online (Sandbox Code Playgroud)
预期结果;
Hello World!
Run Code Online (Sandbox Code Playgroud)
我知道我可能应该使用ViewComponent,但是它是否可以实现上面提到的预期行为?
根据文档:
该
@addTagHelper
指令使标签助手可用于视图。本例中,视图文件为Views/_ViewImports.cshtml
,默认为Views文件夹及子目录下的所有视图文件继承;使标签助手可用。
所以我导入了标签助手Views\_ViewImports.cshtml
:
@using MyProject
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Run Code Online (Sandbox Code Playgroud)
它们可以很好地处理文件Views
夹内的文件。
但是,在文件中Views/Home/Index.cshtml
,我不支持标签助手,它们也没有正确呈现为链接。当我将其复制_ViewImports.cshtml
到文件夹中时Views/Home
,一切都按预期进行。
那么我错过了什么?
更新
那么我错过了什么?我_ViewImports.cshtml
被放在文件夹中Views/Shared
(d'oh)。将其移至 后Views
,TagHelper 在任何地方都按预期工作。
在这个官方的ASP.NET Core教程中,我可以使用输入标记助手,如下所示.但是由于foreach循环中表单元素的已知模型绑定问题,我想改为使用for loop
.问:如果我是来取代@foreach (var item in Model)
与@for (int i=0; i < Model.Count(); i++)
下面View
.我的意思asp-for
是<input asp-for="???" />
什么?出于某种原因,intellisense无法识别,例如Model [i] .BlogId或@Model [i] .BlogId
@model IEnumerable<EFGetStarted.AspNetCore.NewDb.Models.Blog>
@{
ViewBag.Title = "Blogs";
}
<h2>Blogs</h2>
<p>
<a asp-controller="Blogs" asp-action="Create">Create New</a>
</p>
<table class="table">
<tr>
<th>Id</th>
<th>Url</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
<input asp-for="@item.BlogId" />
</td>
<td>
<input asp-for="@item.Url" />
</td>
</tr>
} …
Run Code Online (Sandbox Code Playgroud) 我正在合并TagHelpers
到我的 MVC vNext 项目中,我意识到当我自己关闭 HTML 标签时它们不起作用。
@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
<label asp-for="FirstName"/> <!-- self closing tag -->
<span asp-validation-for="FirstName"/> <!-- self closing tag -->
Run Code Online (Sandbox Code Playgroud)
而且,当我放置结束标签时,我会看到正在显示的值。
<label asp-for="FirstName"></label>
<span asp-validation-for="FirstName"></span>
Run Code Online (Sandbox Code Playgroud)
生成的 HTML
<label for="FirstName">FirstName</label>
<span class="field-validation-error" data-valmsg-for="FirstName" data-valmsg-replace="true">
<span id="FirstName-error" class="">The FirstName field is required</span>
</span>
Run Code Online (Sandbox Code Playgroud)
我想知道什么,它有什么区别?而且,自我关闭配对标签是一个坏习惯。如果您知道一些讨论此设计原则的文章,请与我分享,将不胜感激。
我花了最后一小时重构使用区域,现在我的所有视图似乎都没有函数标记:/
所以这就是Index.cshtml中的内容
<div class="btn-group">
<a asp-controller="Survey" asp-area="Admin" asp-action="Create" class="btn btn-primary">Create New</a>
</div>
Run Code Online (Sandbox Code Playgroud)
...这是呈现的HTML:/
<div class="btn-group">
<a asp-controller="Survey" asp-area="Admin" asp-action="Create" class="btn btn-primary">Create New</a>
</div>
Run Code Online (Sandbox Code Playgroud)
Intellisense甚至不显示asp-前缀,并且asp-属性上的语法突出显示也会丢失.
其他SO问题引用了"asp-route-area",但它只是像其他的一样呈现出verbtim.
这些都在〜/ Views/Name/Index.cshtml中工作正常,将它们移到〜/ Areas/Name/Views/Name /和nopers ......
有什么想法吗?史蒂夫
一些模型属性具有"必需"数据注释,我需要在TagHelper类中读取.
public partial class Sale
{
[Required]
public string CustomerId { get; set; }
...
Run Code Online (Sandbox Code Playgroud)
在销售视图中,我为客户创建了一个自定义选择:
<customer asp-for="CustomerId " value="@Model.CustomerId"></customer>
Run Code Online (Sandbox Code Playgroud)
在CustomerTagHelper类中有进程方法:
public override void Process(TagHelperContext context, TagHelperOutput output)
{
Run Code Online (Sandbox Code Playgroud)
如果当前绑定属性具有"required"属性,我怎么才能发现?我使用的是asp-net核心.
我创建了一个继承自 InputTagHelper 的标签助手,如这篇文章/sf/answers/2834275811/中的答案所示。
这是代码
[HtmlTargetElement("input", Attributes = ForAttributeName)]
public class ExrInputTagHelper : InputTagHelper
{
private const string ForAttributeName = "asp-for";
[HtmlAttributeName("asp-disabled")]
public bool IsDisabled { get; set; }
public ExrInputTagHelper(IHtmlGenerator generator):base(generator)
{
}
public override void Process(TagHelperContext context, TagHelperOutput output)
{
if (IsDisabled)
{
var d = new TagHelperAttribute("disabled", "disabled");
output.Attributes.Add(d);
}
base.Process(context, output);
}
}
Run Code Online (Sandbox Code Playgroud)
这是它的用法:
<input asp-for="UsingCreditCard" type="checkbox" asp-disabled="@Model.UsingACH" />
Run Code Online (Sandbox Code Playgroud)
这很有效,但有一个明显的问题。如果输入类型是复选框,则会呈现两次。所有其他输入类型都很好用。为什么会出现这种情况呢?
<input checked="checked" data-val="true" data-val-required="The UsingCreditCard field is required." id="UsingCreditCard" name="UsingCreditCard" type="checkbox" value="true">
<input checked="checked" id="UsingCreditCard" name="UsingCreditCard" …
Run Code Online (Sandbox Code Playgroud) 我正在使用ASP.Net Core,打字稿,React和Webpack构建一个Webapp。叫做Ui.WebApp
。React应用位于,Ui.WebApp/ClientApp
webpack构建输出到Ui.WebApp/ClientApp/dist
。在我中,Startup.cs
我包括了
app.UseStaticFiles(new StaticFileOptions {
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "ClientApp/dist"))
}
);
Run Code Online (Sandbox Code Playgroud)
那是有效的,即当我加载样式时_Layout.cshtml
(<link rel="stylesheet" href="~/main.css" asp-append-version="true" type="text/css" />
实际位于其中)Ui.WebApp/ClientApp/dist/main.css
。它也适用于我包含为的脚本<script src="~/main.js"></script>
。
现在,我需要使用名称中的哈希值(即)在webpack中构建脚本main_968495a262da1789981f.js
。ASP.Net中的模式是使用<script asp-src-include="~/main_*.js"></script>
。但是,从浏览器查看页面时,没有生成的脚本标记,因为我假设ASP.Net找不到与该模式匹配的任何文件(但是我可以在文件浏览器中看到它)。
奇怪的是,当我手动将散列的js文件放入Ui.WebApp/wwwroot
(否则我不使用)时,脚本标记正确填充。当我删除文件夹并刷新页面时,他们甚至都呆在那里。
因此,我假设ASP.Net在编译时验证了标记帮助器,因此看不到我在中进行的配置Startup.cs
。
有什么方法可以使ASP.Net在运行时验证标记助手并选择正确的位置?
我有一个像这样的简单表单,它使用了 @Html.EditorFor 扩展名:
<form method="post">
@Html.EditorFor(x => x.SystemSettings.EmailFromAddress)
<submit-button title="Save"></submit-button>
</form>
Run Code Online (Sandbox Code Playgroud)
我想利用 .NET Core 的标签助手,让我的表单看起来像这样:
<form method="post">
<editor asp-for="SystemSettings.EmailFromAddress"/>
<submit-button title="Save"></submit-button>
</form>
Run Code Online (Sandbox Code Playgroud)
我最终也想拥有自己的自定义标签助手,这样我就可以做这样的事情:
<text-box asp-for="SystemSettings.EmailFromAddress"></text-box>
Run Code Online (Sandbox Code Playgroud)
我有一个由 @Html.EditorFor 扩展呈现的字符串模板:
@model string
<div class="form-group">
<label asp-for="@Model" class="m-b-none"></label>
<span asp-description-for="@Model" class="help-block m-b-none small m-t-none"></span>
<div class="input-group">
<input asp-for="@Model" class="form-control" />
<partial name="_ValidationIcon" />
</div>
<span asp-validation-for="@Model" class="validation-message"></span>
</div>
Run Code Online (Sandbox Code Playgroud)
为此,我看到有人实现了一个EditorTagHelper,它看起来像这样:
[HtmlTargetElement("editor", TagStructure = TagStructure.WithoutEndTag,
Attributes = ForAttributeName)]
public class EditorTagHelper : TagHelper
{
private readonly IHtmlHelper _htmlHelper;
private const string …
Run Code Online (Sandbox Code Playgroud) 我一直在谷歌上看标签上的例子,但找不到我正在寻找的任何例子.
我有以下代码:
<div class="form-group">
<label asp-for="PersonName" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="PersonName" class="form-control" />
<span asp-validation-for="PersonName" class="text-danger"></span>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
我要做的是用类似的东西替换它
<bootstraprow asp-for="PersonName"></bootstraprow>
Run Code Online (Sandbox Code Playgroud)
但是,我不确定要编写包含其他标记的taghelper
编辑:这与在自定义标记中存储变量不同,但我想调用其他自定义标记或现有标记.