Asp.net условно отключает помощник тега (textarea)

Я хочу включить или отключить текстовое поле в зависимости от состояния, которое исходит из модели, и я использую помощник тега textarea. Другими словами, что-то вроде этого:

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

Но у меня возникла следующая ошибка времени разработки: у тега helper 'textarea' не должно быть С# в области объявления атрибутов элемента.

Затем я попытался:

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

который не показывал ошибки времени разработки, но это выглядит следующим образом: Model.MustDisable==true отображает disabled='disabled' И Model.MustDisable==false отображает disabled. Поэтому текстовая область всегда будет отключена.

Затем я попробовал (удалив его):

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

который не показывал ошибки времени разработки, но делает то же, что и предыдущий.

Как я могу реализовать это правильно?

Ответ 1

Я столкнулся с той же проблемой с помощником select tag, я пробовал несколько вещей, и это сработало. Попробуйте это -

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

Ответ 2

Помощник тега 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; }
}

Ответ 3

Я размещаю это отдельно, так как у меня недостаточно репутации, чтобы добавить комментарий к ответу 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.

Я не заметил никаких проблем с выходом, созданным для текстовых областей, но я столкнулся с проблемами, наследующими от других помощников тегов по умолчанию. Решение состоит в том, чтобы удалить вспомогательный тэг по умолчанию в _ViewImports.cshtml.

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