web-dev-qa-db-ja.com

asp.netは条件に応じてタグヘルパー(textarea)を無効にします

モデルから評価される条件に応じてtextareaを有効または無効にしたいのですが、textareaタグヘルパーを使用しています。つまり、次のようなものです。

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

しかし、次のデザイン時エラーが発生しました。タグヘルパー 'textarea'は、要素の属性宣言領域にC#があってはなりません。

それから私は試しました:

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

設計時エラーは表示されませんでしたが、次のようにレンダリングされます:Model.MustDisable==trueレンダーdisabled='disabled' AND Model.MustDisable==falsedisabledをレンダリングします。したがって、テキスト領域は常に無効になります。

それから私は試しました(を削除します):

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

設計時エラーは表示されませんでしたが、以前のエラーと同じようにレンダリングされます。

これを正しい方法で実装するにはどうすればよいですか?

29
VMh

私はselect tag helperで同じ問題に直面していました、私はいくつかのことを試しました、そしてそれはうまくいきました。これを試して-

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

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

したがって、TextAreaTagHelperクラスから継承する新しいクラスを作成します。

[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);
    }
}

_ViewImports.cshtmlファイルで、@addTagHelperディレクティブを使用して、上記のクラスが定義されているアセンブリを指定し、新しいタグヘルパーが他のかみそりビューで使用できるようにします。

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

これで、ビューで次のように使用できます

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

ここで、SomeViewModelにはDocおよびMustDisableプロパティがあります。

public class YourSomeViewModel
{
  public string Doc { set;get; }
  public bool MustDisable  { set;get; }
}
18
Shyju

これは実際には非常に単純です。無効化属性はすでに希望どおりに機能しています。ブール値を渡すことができます。

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

falseの場合、disabled属性はレンダリングされません

10

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"
3
Eric Scott