モデルから評価される条件に応じて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==false
はdisabled
をレンダリングします。したがって、テキスト領域は常に無効になります。
それから私は試しました(を削除します):
textarea asp-for="Doc" disabled=@(Model.MustDisable ? "disabled" : "")></textarea>
設計時エラーは表示されませんでしたが、以前のエラーと同じようにレンダリングされます。
これを正しい方法で実装するにはどうすればよいですか?
私はselect tag helperで同じ問題に直面していました、私はいくつかのことを試しました、そしてそれはうまくいきました。これを試して-
<textarea asp-for="Doc" disabled="@(Model.MustDisable ? "disabled" : null)"></textarea>
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; }
}
これは実際には非常に単純です。無効化属性はすでに希望どおりに機能しています。ブール値を渡すことができます。
<textarea asp-for="Doc" disabled="@Model.MustDisable"></textarea>
falseの場合、disabled
属性はレンダリングされません
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"
MyCustomTextArea
とTextAreaTagHelper
は、textareaタグごとに実行されます。
Textareasに対して生成された出力の問題には気づきませんでしたが、他のデフォルトのタグヘルパーから継承する問題に遭遇しました。解決策は、_ViewImports.cshtmlのデフォルトのタグヘルパーを削除することです。
@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
@addTagHelper "*,YourAssemblyNameHere"
@removeTagHelper "Microsoft.AspNet.Mvc.TagHelpers.TextAreaTagHelper, Microsoft.AspNet.Mvc.TagHelpers"