C# 合并TagHelper语句

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

我使用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类中组合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