2016-11-08 23 views
4

Ich möchte einen Eingabe-Tag-Helfer mit Rasierer-Code kombinieren, um ein Attribut zu setzen, aber ich kann nicht die beiden Technologien zusammen zu bekommen. Ich versuche einfach, das deaktivierte Attribut für das Eingabefeld basierend auf dem Wert der Ansichtsmodelleigenschaft festzulegen.ASP.NET Kern Eingabe Tag Helfer nicht mit Razor Code arbeiten

Wenn ich den Rasierer Code setzen nach dem asp-for Tag der Rasierer Intellisense nicht erkannt wird und das Feld nicht wie erwartet deaktiviert ...

<input asp-for="OtherDrugs" @((Model.OtherDrugs == null) ? "disabled" : "") class="form-control" /> 

gerenderte Ausgabe ...

<input type="text" id="OtherDrugs" name="OtherDrugs" value="" /> 

Wenn ich den Rasierklingen-Code vor dem Tag asp-for setze, wird der Tag-Helfer intellisense nicht erkannt und das Feld wird nicht mit den Eigenschaften des Ansichtsmodells wie erwartet eingestellt ...

<input @((Model.OtherDrugs == null) ? "disabled" : "") asp-for="OtherDrug" class="form-control" /> 

gerenderte Ausgabe ...

<input disabled asp-for="OtherDrugs" class="form-control" /> 

Beachten Sie, dass Helfer und Rasierer-Tag kombiniert funktioniert, wenn der Rasierer-Code innerhalb einer Klasse Attribut ist. Leider erfordern Eingabefelder das deaktivierte Attribut und nicht die deaktivierte Klasse für den Bootstrap 3.

Gibt es eine Möglichkeit, dies zu erreichen?

+0

Ich habe TagHelpers nicht verwendet, also bin ich hier im Dunkeln schießen, können Sie das ternary in wickeln? – JB06

Antwort

9

Um das deaktivierte Eingabeelement zu rendern, müssen Sie einfach ein deaktiviertes Attribut hinzufügen. Alle folgenden Elemente werden ein deaktiviertes Eingabetextelement darstellen.

Im Asp.NET-Core können Sie den vorhandenen Eingabe-Tag-Helfer erweitern, um einen Readonly-Eingabe-Tag-Helfer zu erstellen.

Erweitern Sie die InputTagHelper Klasse, fügen Sie eine neue Eigenschaft hinzu, um zu identifizieren, ob die Eingabe deaktiviert werden soll oder nicht, und fügen Sie auf der Grundlage dieses Werts das Attribut "disabled" zur Eingabe hinzu.

[HtmlTargetElement("input", Attributes = ForAttributeName)] 
public class MyCustomTextArea : InputTagHelper 
{ 
    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) 
     { 
      var d = new TagHelperAttribute("disabled", "disabled"); 
      output.Attributes.Add(d); 
     } 
     base.Process(context, output); 
    } 
} 

nun diese benutzerdefinierte Textarea Helfer zu verwenden, müssen Sie die addTagHelper Methode in _ViewImports.cshtml nennen.

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 
@addTagHelper *, YourAssemblyNameHere 

nun Ihrer Meinung nach, können Sie den asp-is-disabled Attributwert angeben.

<input type="text" asp-for="OtherDrugs" 
            asp-is-disabled="@Model.OtherDrugs==null"/> 
+0

wäre schön, damit es aus der Box funktioniert, aber Ihre benutzerdefinierte Tag-Helfer hat den Trick gut gemacht. Danke – OjM

+0

@Shyju Ich benutzte dieses benutzerdefinierte Tag Helfer für die Eingaben und es funktionierte gut, außer einem Problem. Es rendert ein Kontrollkästchen zweimal. Irgendwelche Gedanken dazu? – dherrin79

+0

Das gleiche hier, es funktioniert nicht so wie es sollte. – Marko

-1

du bist besser dran etwas wie dies zu tun:

@{ 
    var isDisabled = ((Model.OtherDrugs == null) ? "disabled" : string.Empty()); 
} 

und dann

@Html.TextBox("OtherDrugs", "", new { isDisabled }) 
+1

Es ist nicht TagHelper –

1

Sie können ASP-Core-Tag Helfer wie folgt aus:

<input asp-for="Name" /> 

und dann [Editierbar (falsch)] für Ihre Eigenschaft wie folgt setzen:

[Editable(false)] public string Name {set;get;}

dann sollten Sie InputTagHelper erweitern:

[HtmlTargetElement("input", Attributes = ForAttributeName)] 
public class ExtendedInputTagHelper : InputTagHelper 
{ 
    private const string ForAttributeName = "asp-for"; 

    public ExtendedInputTagHelper(IHtmlGenerator generator) 
     : base(generator) { } 

    public override void Process(TagHelperContext context, TagHelperOutput output) 
    { 
     var isContentModified = output.IsContentModified; 

     if (For.Metadata.IsReadOnly) 
     { 
      var attribute = new TagHelperAttribute("disabled", "disabled"); 
      output.Attributes.Add(attribute); 
     } 

     if (!isContentModified) 
     { 
      base.Process(context, output); 
     } 
    } 
} 

und schließlich Ihre TagHelper in _ViewImports.cshtml importieren:

@addTagHelper *, <your assembly name> 

der Vorteil dieser Lösung Logik in Modell setzt und Erhaltung der MVC-Prinzipien.

Verwandte Themen