2016-01-19 22 views
10

Voglio abilitare o disabilitare un'area di testo in base a una condizione che valuta dal modello e sto usando l'helper del tag textarea. In altre parole, qualcosa di simile:asp.net disabilita condizionatamente un helper di tag (area di testo)

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

Ma ho ottenuto il seguente errore in fase di progettazione: Il 'textarea' tag aiutante non deve avere C# nella zona dichiarazione di attributo dell'elemento.

Poi ho provato:

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

che non ha mostrato alcun errore di fase di progettazione, ma rende in questo modo: Model.MustDisable==true rende disabled='disabled' E Model.MustDisable==false rende disabled. Quindi l'area di testo sarà sempre disabilitata.

Poi provato (rimozione del 's):

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

che non ha mostrato alcun errore di tempo di progettazione ma rende la stessa di quella precedente.

Come posso implementarlo nel modo giusto?

+0

Perché non anche rendere l'attributo disabled condizionalmente come bene? –

risposta

12

L'helper del tag textarea non dispone di supporto diretto per il rendering condizionale di un'area di testo disabilitata. Ma puoi sempre estendere lo TextAreaTagHelper e aggiungere questa funzionalità.

Quindi creare una nuova classe che eredita dalla classe 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); 
    } 
} 

Nel file _ViewImports.cshtml, utilizzando la direttiva @addTagHelper, specificare il gruppo in cui la classe di cui sopra è definita in modo che il nostro nuovo tag aiutante è disponibile in altre viste rasoio.

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

Ora nel vostro punto di vista, è possibile utilizzarlo come

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

dove SomeViewModel ha una proprietà Doc e MustDisable.

public class YourSomeViewModel 
{ 
    public string Doc { set;get; } 
    public bool MustDisable { set;get; } 
} 
+1

Funziona meglio della risposta in uptot superiore ed è anche un po 'più bello dell'utilizzo di un'espressione ternaria per aggiungere l'attributo disabilitato. Grazie! – nbokmans

1

Sto postando questo separatamente poiché non ho abbastanza reputazione per aggiungere un commento alla risposta di Shyju.

Se si eredita da uno dei tag helper predefiniti e quindi si registrano sia gli helper dei tag predefiniti che l'helper del tag personalizzato in _ViewImports.cshtml, allora entrambi gli helper dei tag verranno eseguiti per i tag specificati.

Per il seguente:

[HtmlTargetElement("textarea", Attributes = ForAttributeName)] 
public class MyCustomTextArea : TextAreaTagHelper 
{ 
    private const string ForAttributeName = "asp-for"; 
... 

Con la seguente _ViewImports.cshtml:

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

Sia MyCustomTextArea e TextAreaTagHelper verrà eseguito per ogni tag textarea.

Non ho notato alcun problema con l'output generato per le aree di testo, ma ho incontrato problemi che ereditano da altri helper di tag predefiniti. La soluzione è rimuovere il tag helper predefinito in _ViewImports.cshtml.

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

@removeTagHelper Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper, Microsoft.AspNetCore.Mvc.TagHelpers –

20

Mi trovavo di fronte allo stesso problema con il tag select helper, ho provato alcune cose e ha funzionato. Prova questo-

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

+3

Non penso che funzionerà su tutti i browser. 'disabled = ""' causerà la disabilitazione di un input. – user942620

+0

@ user942620 hai ragione ma solo in caso di utilizzo di "" invece di null –

+0

Questo !!! Molte grazie! Mi chiedo ancora perché MS non permetta un normale @ (condizione? "Disabilitato": ""), ma stavo per estendere il TagHelper (troppo lavoro per una cosa così piccola!) E questa soluzione mi ha salvato la giornata! ;) –