2016-01-19 20 views
10

モデルから評価される条件に応じてテキストエリアを有効または無効にしたいのですが、私はtextareaタグヘルパーを使用しています。つまり 、このような何か:asp.netタグヘルパー(テキストエリア)を条件付きで無効にする

<textarea asp-for="Doc" @(Model.MustDisable ? "disabled" : "")></textarea> 

しかし、私は、次のデザイン時のエラーを得た:タグヘルパー「テキストエリアには、」要素の属性宣言エリアでのC#を持っていなければなりません。

は、次に私が試した:任意の設計時のエラーを示さなかった

<textarea asp-for="Doc" disabled='@(Model.MustDisable ? "disabled" : "")'></textarea> 

が、それは次のようにレンダリング: Model.MustDisable==truedisabled='disabled'をレンダリングしModel.MustDisable==falsedisabledをレンダリングします。 したがって、テキスト領域は常に無効になります。

は、それから私は(さんを削除)しようとした:任意の設計時のエラーを示さなかった

textarea asp-for="Doc" [email protected](Model.MustDisable ? "disabled" : "")></textarea> 

が、それは前のものと同じレンダリングします。

これをどのように正しく実装できますか?

+0

を試してみてください理由だけでも同様に条件付きでdisabled属性をレンダリングしませんか? –

答えて

12

textareaタグヘルパーは、無効にされたテキスト領域を条件付きでレンダリングする直接的なサポートを持っていません。しかし、いつでもTextAreaTagHelperを拡張してこの機能を追加することができます。

TextAreaTagHelperクラスから継承する新しいクラスを作成します。 @addTagHelperディレクティブを使用して_ViewImports.cshtmlファイルで

[HtmlTargetElement("textarea", Attributes = ForAttributeName)] 
public class MyCustomTextArea : TextAreaTagHelper 
{ 
    private const string ForAttributeName = "asp-for"; 

    [HtmlAttributeName("asp-is-disabled")] 
    public bool IsDisabled { set; get; } 

    public MyCustomTextArea(IHtmlGenerator generator) : base(generator) 
    { 
    } 

    public override void Process(TagHelperContext context, TagHelperOutput output) 
    { 
     if (IsDisabled) 
     { 
      output.Attributes["disabled"] = "disabled"; 
     }   
     base.Process(context, output); 
    } 
} 

、私たちの新しいタグヘルパーは、他のかみそりビューで使用できるように、上記のクラスが定義されているアセンブリを指定します。

@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers" 
@addTagHelper "*,YourAssemblyNameHere" 

は今、あなたの意見では、あなたは SomeViewModelDocMustDisable性質を持っている

@model YourSomeViewModel 
<textarea asp-for="Doc" asp-is-disabled="Model.MustDisable"></textarea> 

のようにそれを使用することができます。

public class YourSomeViewModel 
{ 
    public string Doc { set;get; } 
    public bool MustDisable { set;get; } 
} 
+1

top upoted答えよりも優れていますし、無効な属性を追加するために三項式を使用するよりも少し良いです。ありがとう! – nbokmans

1

私はShyjuの答えにコメントを追加するには十分な評判がないので、これを別に投稿しています。

デフォルトのタグヘルパーのいずれかを継承し、デフォルトのタグヘルパーとカスタムタグヘルパーの両方を_ViewImports.cshtmlに登録すると、両方のタグヘルパーが指定されたタグに対して実行されます。以下について

[HtmlTargetElement("textarea", Attributes = ForAttributeName)] 
public class MyCustomTextArea : TextAreaTagHelper 
{ 
    private const string ForAttributeName = "asp-for"; 
... 

以下_ViewImports.cshtml付:

@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers" 
@addTagHelper "*,YourAssemblyNameHere" 

両方MyCustomTextAreaTextAreaTagHelper各textareaタグに対して実行されます。

私はtextareasのために生成された出力には何の問題も気づいていませんでしたが、他のデフォルトのタグヘルパーを継承している問題にぶつかりました。解決方法は、_ViewImports.cshtmlのデフォルトのタグヘルパーを削除することです。

@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers" 
@addTagHelper "*,YourAssemblyNameHere" 
@removeTagHelper "Microsoft.AspNet.Mvc.TagHelpers.TextAreaTagHelper, Microsoft.AspNet.Mvc.TagHelpers" 
+0

@removeTagHelper Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper、Microsoft.AspNetCore.Mvc.TagHelpers –

20

私はselectタグヘルパーで同じ問題に直面していましたが、私はいくつかのことを試してみました。 this-

<textarea asp-for="Doc" disabled="@(Model.MustDisable ? "disabled" : null)"></textarea>

+3

これはすべてのブラウザで動作するとは思わない。 'disabled = ""'は入力を無効にします。 – user942620

+0

@ user942620あなたは正しいですが、nullの代わりに ""を使用する場合にのみ –

+0

これは!!!どうもありがとう!私はまだMSが通常の@(条件: "無効": "")を許可しない理由を疑問に思っていますが、TagHelperを拡張しようとしていました。 ;) –

関連する問題