2017-08-07 21 views
1

Mein Ziel ist bedingt Deaktivieren Sie eine Dropdown-Liste abhängig vom Status des Modells, das an die Ansicht übergeben wird.Wie Sie <select> von Tag Helper konditional deaktivieren?

Der folgende Code macht richtig einen behinderten <select> Tag (aber nicht bedingt):

<select class="form-control" asp-for="Priority" asp-items="@priorityList" disabled></select> 

Die folgenden nicht. Das Attribut disabled erscheint nicht auf der Seite Quelle für die gerenderte Seite:

@{ string disabled = Model.CaseMode == Mode.Active ? "" : "disabled"; } 
<select class="form-control" asp-for="Priority" asp-items="@priorityList" @disabled></select> 

Auch auch folgenden nicht den <select> Tag nicht deaktiviert.

<select class="form-control" asp-for="Priority" asp-items="@priorityList" @((Model.CaseMode == Mode.Closed) ? "disabled" : "")></select> 

Ich gehe davon aus das Problem hat mit dem Tag Helfer Verarbeitung des <select> Tag, bevor der String-Ersetzung in der Vorlage erfolgt zu tun. Kann jemand vorschlagen, wie ich dieses Element bedingt deaktivieren kann, ohne zwei getrennte Elemente in einer if else Struktur zu rendern?

Antwort

2

Es ist nicht möglich mit dem Standard select Tag Helper, aber Sie können Ihre eigenen erstellen und konfigurieren, um auf ein benutzerdefiniertes asp-disabled Attribut zu reagieren, das eine Boolean akzeptiert.

Ihrer Ansicht:

<select class="form-control" asp-for="Priority" asp-items="@priorityList" asp-disabled="@(Model.CaseMode == Mode.Closed)"></select> 

Dann erstellen Sie Ihre TagHelper Klasse:

using Microsoft.AspNetCore.Razor.TagHelpers; 
using System; 

namespace YourNamespace.TagHelpers 
{ 
    // Triggered on all select elements with the asp-disabled attribute 
    [HtmlTargetElement("select", Attributes = DisabledAttributeName)] 
    public class SelectTagHelper : TagHelper 
    { 
     private const string DisabledAttributeName = "asp-disabled"; 

     /// Get the value of the condition 
     [HtmlAttributeName(DisabledAttributeName)] 
     public bool Disabled { get; set; } 

     public override void Process(TagHelperContext context, TagHelperOutput output) 
     { 
      if (context == null) 
       throw new ArgumentNullException(nameof(context)); 

      if (output == null) 
       throw new ArgumentNullException(nameof(output)); 

      if (Disabled) 
       output.Attributes.SetAttribute("disabled", null); 
     } 
    } 
} 

Ihre TagHelper Um sicherzustellen, verwendet wird, werden Sie es auch in _ViewImports.cshtml registrieren müssen:

@addTagHelper *, YourNamespace 
+0

Danke:

<select class="form-control" id="Priority" name="Priority" disabled="disabled">...</select> <select class="form-control" id="Priority" name="Priority">...</select> 

ich es von hier realisiert. Dies ist additiv zu dem vorhandenen "