Ответ 1
Я столкнулся с той же проблемой с помощником select tag, я пробовал несколько вещей, и это сработало. Попробуйте это -
<textarea asp-for="Doc" disabled="@(Model.MustDisable ? "disabled" : null)"></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>
который не показывал ошибки времени разработки, но делает то же, что и предыдущий.
Как я могу реализовать это правильно?
Я столкнулся с той же проблемой с помощником select tag, я пробовал несколько вещей, и это сработало. Попробуйте это -
<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; }
}
Я размещаю это отдельно, так как у меня недостаточно репутации, чтобы добавить комментарий к ответу 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"