41

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

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

しかし、次の設計時エラーが発生しました: タグ ヘルパー 'textarea' は、要素の属性宣言領域に C# を含めることはできません。

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

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

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

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

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

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

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

4

4 に答える 4

45

タグヘルパーの選択で同じ問題に直面していましたが、いくつか試してみましたが、うまくいきました。これを試して-

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

于 2016-07-14T06:29:02.473 に答える
19

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上記のクラスが定義されているアセンブリを指定し、新しいタグ ヘルパーを他の Razor ビューで使用できるようにします。

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

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

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

whereSomeViewModelにはDocandMustDisableプロパティがあります。

public class YourSomeViewModel
{
  public string Doc { set;get; }
  public bool MustDisable  { set;get; }
}
于 2016-01-19T04:10:30.467 に答える
3

Shyjuの回答にコメントを追加するのに十分な評判がないため、これを個別に投稿しています。

既定のタグ ヘルパーの 1 つを継承し、既定のタグ ヘルパーとカスタム タグ ヘルパーの両方を _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"

各 textarea タグに対して と のMyCustomTextArea両方が実行されます。TextAreaTagHelper

テキストエリア用に生成された出力に問題はありませんでしたが、他のデフォルト タグ ヘルパーから継承する際に問題が発生しました。解決策は、_ViewImports.cshtml の既定のタグ ヘルパーを削除することです。

@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
@addTagHelper "*,YourAssemblyNameHere"
@removeTagHelper "Microsoft.AspNet.Mvc.TagHelpers.TextAreaTagHelper, Microsoft.AspNet.Mvc.TagHelpers"
于 2016-04-11T16:11:17.927 に答える