我使用asp core 2.0 MVC,经常以这种形式使用以下代码:
<form asp-controller="Foo" asp-action="Bar">
<div class="form-group">
<label asp-for="Age"></label>
<input asp-for="Age" class="form-control"/>
<span asp-validation-for="Age" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Name"></label>
<input asp-for="Name" class="form-control"/>
<span asp-validation-for="Name" class="text-danger"></span>
</div>
</form>
有没有一种方法可以在TagHelper类中组合标签,输入和跨度标签以编写如下内容:
<div class="form-group">
<foo for="Age">
</div>
这将产生以下结果:
<label asp-for="Age"></label>
<input asp-for="Age" class="form-control"/>
<span asp-validation-for="Age" class="text-danger"></span>
为了避免一遍又一遍地为我的属性编写这3个通用标签?
先感谢您。
编辑:
嘿,伊斯玛,谢谢你的回答。
您的代码会生成纯文本
<label asp-for="Age"></label>
<input asp-for="Age" class="form-control"/>
<span asp-validation-for="Age" class="text-danger"></span>
html。
但是我想要“已处理”版本
<input asp-for="Age"/>
是
<input type="number" data-val="true" data-val-range="The field Age must be between 0 and 100." data-val-range-max="100" data-val-range-min="0" data-val-required="The Age field is required." id="Age" name="Age" value="" />
在HTML
有没有办法做到这一点?
最佳答案
这可能对您有用,或者至少使您朝正确的方向发展,我使用了一个自定义TagHelper,该TagHelper使用其TagHelper实现来生成其他元素并附加所有输出(通过道路)。
[HtmlTargetElement("myfield")]
public class MyFieldTagHelper : TagHelper
{
private IHtmlGenerator _htmlGenerator;
public MyFieldTagHelper(IHtmlGenerator htmlGenerator)
{
_htmlGenerator = htmlGenerator;
}
public string LabelContent { get; set; }
public string ValidationContent { get; set; }
[HtmlAttributeName("asp-for")]
public ModelExpression For { get; set; }
[HtmlAttributeNotBound]
[ViewContext]
public ViewContext ViewContext { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
var labelContext = CrateTagHelperContext();
var labelOutput = CrateTagHelperOutput("label");
labelOutput.Content.Append(LabelContent);
if (For != null)
{
labelOutput.Attributes.Add("for", For.Name);
}
var label = new LabelTagHelper(_htmlGenerator)
{
ViewContext = ViewContext
};
label.Process(labelContext, labelOutput);
var inputContext = CrateTagHelperContext();
var inputOutput = CrateTagHelperOutput("input");
inputOutput.Attributes.Add("class", "form-control");
var input = new InputTagHelper(_htmlGenerator)
{
For = For,
ViewContext = ViewContext
};
input.Process(inputContext, inputOutput);
var validationContext = CrateTagHelperContext();
var validationOutput = CrateTagHelperOutput("span");
validationOutput.Content.Append(ValidationContent);
validationOutput.Attributes.Add("class", "text-danger");
var validation = new ValidationMessageTagHelper(_htmlGenerator)
{
For = For,
ViewContext = ViewContext
};
validation.Process(validationContext, validationOutput);
output.TagName = "";
output.Content.AppendHtml(labelOutput);
output.Content.AppendHtml(inputOutput);
output.Content.AppendHtml(validationOutput);
}
private static TagHelperContext CrateTagHelperContext()
{
return new TagHelperContext(
new TagHelperAttributeList(),
new Dictionary<object, object>(),
Guid.NewGuid().ToString("N"));
}
private static TagHelperOutput CrateTagHelperOutput(string tagName)
{
return new TagHelperOutput(
tagName,
new TagHelperAttributeList(),
(a,b) =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent(string.Empty);
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
}
}
现在,在您看来,您应该可以执行以下操作:
<myfield label-content="This is a label" validation-content="Validation content" asp-for="Age"></myfield>
它将为您生成整个块。
记住,即使在Web应用程序中有标记帮助程序,也要在其中注册该程序集,您可以通过编辑Views / _ViewImports.cshtml文件并添加以下行来实现:
@addTagHelper *, YourAssemblyName
更多信息:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro