C# 合并TagHelper语句
我使用asp core 2.0 MVC,并经常在以下表单中使用类似的代码:C# 合并TagHelper语句,c#,asp.net,razorengine,C#,Asp.net,Razorengine,我使用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"/> <s
<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类中组合label、input和span标记,只需编写如下内容:
<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"/>
是
在html中
有什么方法可以实现这一点吗?这可能对您有用,或者至少可以让您走上正确的方向,我使用了一个自定义TagHelper,它使用TagHelper实现生成其他元素,并附加所有输出(顺便说一句,可能有更好/更干净的方法)
更多信息:嘿,伊斯玛,你能检查一下我在ini帖子中的“编辑”吗?嘿,对不起@GrayFox,我完全忽略了你问题的复杂性。我用另一次尝试更新了我的答案,希望我们现在会更接近。让我知道结果是什么。嘿,再次谢谢你。输入工作正常。但是标签和验证是空的。我得到html,但预期的行为是年龄。似乎是label.Process(labelContext,labelOutput);不工作的任何原因为标签你必须设置内容在你的标签我更新了答案,“为”和内容应显示在标签和验证。
<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="" />
[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>
@addTagHelper *, YourAssemblyName