2016-04-23 15 views
2

.Net Core RC1を使用してMVC 6のタグヘルパーを作成しようとしています。私はスーパー近くsources良い数ではなく、何かを発見した、thisが最も近かった私が見つかりました。そして、私は私の既存のコードを作成するために必要な考えの要素ました:これで起動するにはMVC 6 .Net Core1リッカートスケールのカスタムタグヘルパーを作成

を私のターゲットHTMLです:

<span class="form-control"> 
       Highly Disagree 
       <input type="radio" name="MakingSense" value=1 /> 
       <input type="radio" name="MakingSense" value=2 /> 
       <input type="radio" name="MakingSense" value=3 /> 
       <input type="radio" name="MakingSense" value=4 /> 
       <input type="radio" name="MakingSense" value=5 /> 
       Highly Agree 
      </span> 

今は入力タグの1つを表示しようとしています。私がそれを理解できれば、私は他のものを手に入れるためのループを追加します。ここに私のTagHelperここ

[HtmlTargetElement("input", Attributes = LikertForAttributeName)] 
public class LikertTagHelper : TagHelper 
{ 
    private const string LikertForAttributeName = "likert-for"; 

    [HtmlAttributeName(LikertForAttributeName)] 
    public string ModelField { get; set; } 

    public override void Process(TagHelperContext context, TagHelperOutput output) 
    { 
     var content = new StringBuilder(); 
     var input = new TagBuilder("input"); 
     input.MergeAttribute("type", "radio"); 
     input.MergeAttribute("name", ModelField); 
     input.MergeAttribute("value", "1"); 
     content.AppendLine(input.ToString()); 
     output.Content.SetContent(content.ToString()); 
     output.PreContent.SetHtmlContent("<span class=\"form-control\""); 
     output.PostContent.SetHtmlContent("</span>"); 
    } 

} 

は私のかみそりCSHTMLです:

<input likert-for="CharacterUnderstanding" /> 

しかし、私は私のHTML出力としてこれを取得する:

<input /> 

だから、タグを拾っていると、それを処理しますが、私は期待していません。私が間違ったところでの助けは大いに感謝されるでしょう。

答えて

1

あなたのタグヘルパーの開始点は入力タグなので、contentは自己閉じ入力タグです。

あなたがしたいまず最初に、たとえば、spanタグにその電源を入れている:

//Replace initial output (an input tag) with a span 
var outerTag = new TagBuilder("span"); 
outerTag.AddCssClass("form-control"); 
output.MergeAttributes(outerTag); 
output.TagName = outerTag.TagName; 
output.TagMode = TagMode.StartTagAndEndTag; 

出力はspanタグであるので、あなたは、内側のコンテンツの追加を開始することができます

  • 非常に同意します非常に反対ののラベルは前/後のコンテンツ(スパンの内側にあります)に追加できます:

  • ラジオボタンは、スパンのコンテンツに追加することができます。

    //Add the radio buttons 
    for(var x =0; x<5; x++) 
    { 
        var input = new TagBuilder("input"); 
        input.MergeAttribute("type", "radio"); 
        input.MergeAttribute("name", ModelField); 
        input.MergeAttribute("value", x.ToString()); 
        output.Content.Append(input); 
    } 
    

場所にこのタグヘルパーでは、かみそりビューで次の行:

<input likert-for="CharacterUnderstanding" /> 

は次のように表示されます。

<span class="form-control"> 
    Highly Disagree 
    <input name="CharacterUnderstanding" type="radio" value="0"> 
    <input name="CharacterUnderstanding" type="radio" value="1"> 
    <input name="CharacterUnderstanding" type="radio" value="2"> 
    <input name="CharacterUnderstanding" type="radio" value="3"> 
    <input name="CharacterUnderstanding" type="radio" value="4"> 
    Highly Agree 
</span> 

補足として、文字列を受け入れるオーバーロードを使用してコンテンツを追加するときは注意が必要です。元のコードでは、content.AppendLine(input.ToString());という行は、実際にはタグビルダーの内容の代わりにMicrosoft.AspNet.Mvc.Rendering.TagBuilderを追加していました。

+0

ありがとうございます。私はどこが間違っていたかを見て、数分後に追いかけると思います。私はoutput.MergeAttributesが何をしているのか分からないと思う。出力にはMergeAttributesがありますか?それはinput.MergeAttribute(key、value)ですか? – Xaxum

+0

更新プログラムとして。しかし、私はSpan CSSクラスを追加することができませんでした。したがって、すべてがHTMLを正しくレンダリングしますが、スパンのクラスはありませんか? – Xaxum

+0

'output.MergeAttributes'は' Microsoft.AspNet.Mvcの拡張メソッドを使います。TagHelpers'(RC1と仮定します)。私は、出力スパンにフォームコントロールクラスを追加するとともに、剃刀コードで指定されている追加の属性とクラスを許可しています。例えば、あなたは ... 'と表示されるような、剃刀' 'を持つことができます。答えのようにコードを試しましたか?それは私のために正常に動作します –

関連する問題