2009-06-17 8 views
1

この拡張メソッドを作成しようとしました。ページのレンダリング時にヘルパーを表示するには、テキストではなく、コントロールをレンダリングしていることを除いて作品:ASP.NET MVCヘルパー拡張メソッドがテキストをコントロールとしてレンダリングしない

私はSystem.Web.Mvc.Htmlを使用して含まれます。 helper.RadioButtonを理解できるように、この拡張メソッドが含まれているヘルパークラスの先頭に配置します。ビューの

public static string WriteTestControlToScreen(this HtmlHelper helper) 
{ 
    StringBuilder fields = new StringBuilder(); 
    fields.Append("<fieldset>"); 
    fields.Append("  <div class='formLabel'><span class='requiredText'>*</span><label>Background Color</label></div>"); 
    fields.Append("  <div class='formField'>" + helper.RadioButton("rbBackgroundColorWhite", 0, false) + "<label class='fieldInlineLabel' for=''>White</label></div>"); 
    fields.Append("  <div class='formField'>" + helper.RadioButton("rbBackgroundColorWhite", 0) + "<label class='fieldInlineLabel' for=''>Black</label></div>"); 
    fields.Append("</fieldset>"); 

    return fields.ToString(); 
} 

出力は、(それが代わりにテキストとしてそれをラジオボタンをレンダリングするが、治療ではないです注意してください)次のようになります。

*背景色 <% = Html.RadioButton(「rbBackgroundColorWhite」、0 、偽)%>ホワイト <% = Html.RadioButton(「rbBackgroundColorWhite」、0)%>ブラック

+0

どのようにWriteTestControlToScreenを呼び出すのですか? –

+0

<%= Html.WriteTestControlToScreen()%> – PositiveGuy

答えて

1

私は反射板と周りに少し突きをした、と私は入力のためのMVCの拡張メソッドは、すべてが使用するフィールドことに気づきましたInputHelperクラスはTagBuilderクラスを使用します:

private static string InputHelper(this HtmlHelper htmlHelper, InputType inputType, string name, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, IDictionary<string, object> htmlAttributes) 
{ 
    ModelState state; 
    if (string.IsNullOrEmpty(name)) 
    { 
     throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name"); 
    } 
    TagBuilder builder = new TagBuilder("input"); 
    builder.MergeAttributes<string, object>(htmlAttributes); 
    builder.MergeAttribute("type", HtmlHelper.GetInputTypeString(inputType)); 
    builder.MergeAttribute("name", name, true); 
    string str = Convert.ToString(value, CultureInfo.CurrentCulture); 
    bool flag = false; 
    switch (inputType) 
    { 
     case InputType.CheckBox: 

       //...etc. 

以下に、さまざまな入力タイプに必要な追加のレンダリングについて説明します。しかし、あなたはポイントを得る。 MVCの人々は文字列を連結しません。彼らはMergeAttribute(および他の)メソッドを使用して、彼らのために汚い仕事をしています。私の推測では、そこにもいくつかのブラウザの互換性の良さがあります。私は示唆しています何

を使用すると、MVCの人々が行うと同じように、あなたのHTMLを構築するためにTagBuilderクラスを使用することができることです。

+0

最後に、文字列を返すだけではありませんか?つまり、return tagBuilder.ToString(TagRenderMode.SelfClosing); –

+0

はい、私の2番目の答えは下記をご覧ください。私はInputHelperを再利用し、ちょうど同じ効果ではなく、再発明ホイールを取得し、TagBuilder –

+0

は**思える、InputHelperはプライベートです。私は自分のクラスに何か同じものをコピーしなければならないだろう。 – PositiveGuy

1

あなたの元のコードの問題は、あなたがMVCリテラルHTML出力を期待している時に<% =%>タグを出力していることです。つまり、これらのタグを処理していません。

はた.ascxファイルにあなたのHTMLを入れてRenderPartialをやって考えてみましょう。

+0

しかし、これはヘルパーメソッドです、あなたはそれを.ascxに置くと言っていますか?私は常にすべての私のHTMLのために.ascxを使用したいとは思わない。 – PositiveGuy

+0

問題はMVCがあなたの<%= %>タグがヘルパーメソッドではなくビューにあることを期待していることです。ヘルパーメソッドになるまでには、それは遅すぎます。レンダリングエンジンは、これらのタグを探すヘルパーメソッドHTMLを経由しません。 –

+0

ヘルパーメソッドを自由に作成できます。あなたはちょうど<%= %>タグをそれらに入れることはできません。 –

1

私はこれは古い記事ですけど、私はお互いの中にTelerik MVCコントロールをレンダリングするときに私が使用しているエレガントな解決策があります。しかし、それはどんなHTMLヘルパーでも使うことができます。

<!-- This helper avoids nested literals with the sub-panel item --> 
@helper RenderPositionalResponsibilities() 
{ 
    Html.Telerik().PanelBar() 
     .Name("ContactSubItem") 
     .Items(subitem => 
     { 
      subitem.Add() 
       .Text("Positional Responsibilities") 
       .Content(
        @<text> 
         <div class="container scrollable" style="height: 150px;"> 
          @Html.CheckboxFor(model => model.IsTrue) 
         </div> 
        </text> 
       ) 
       .Expanded(true); 
     }) 
     .Render(); 
} 

を以下の内容方法に示すように、それはその後、呼び出すことができます:

@{Html.Telerik().PanelBar() 
.Name("pnlUserForm") 
.ClientEvents(e => e.OnExpand("pnlUserForm_OnExpand").OnCollapse("pnlUserForm_OnCollapse")) 
.Items(i => 
{ 
    i.Add() 
     .Text("User Information") 
     .Expanded(true) 
     .Content(
      @<text> 
       <div> 
        @RenderPositionalResponsibilities() 
       </div> 
      </text> 
     ) 
} 
.Render(); 
} 

これは良いかもしれないそれは、以下のようにファイル(かみそりのために)CSHTMLにインラインヘルパーを作成する必要が非常に特定の目的のためにヘルパーを作成したいユーザーのために一致します。さらに、cshtmlファイル(かみそり用)にヘルパーを作成するので、コントロールのすべてのインテリセンスが得られます。

関連する問題