Dies ist ein Paket, das zum Hinzufügen serverseitiger Hilfsmethoden für HttpRequest
und HttpResponse
entwickelt wurde. Dies vereinfacht die Arbeit mit serverseitigen Htmx-Konzepten. Sie sollten auch über Hyperscript lesen, ein optionales Begleitprojekt für HTMX.
Wenn Sie neu bei HTMX sind, schauen Sie sich diese Serie über die ersten Schritte mit HTMX für ASP.NET Core-Entwickler an, die auch ein Beispielprojekt und Muster enthält, die für Sie hilfreich sein könnten.
Installieren Sie das Htmx
NuGet-Paket in Ihrem ASP.NET Core-Projekt.
dotnet add package Htmx
Mithilfe von HttpRequest
können wir feststellen, ob die Anfrage von Htmx auf dem Client initiiert wurde.
httpContext . Request . IsHtmx ( )
Dies kann verwendet werden, um entweder eine vollständige Seitenantwort oder ein teilweises Seitenrendering zurückzugeben.
// in a Razor Page
return Request . IsHtmx ( )
? Partial ( " _Form " , this )
: Page ( ) ;
Wir können auch die anderen Header-Werte abrufen, die htmx möglicherweise festlegt.
Request . IsHtmx ( out var values ) ;
Weitere Informationen zu den anderen Header-Werten finden Sie auf der offiziellen Dokumentationsseite.
Beachten Sie bitte besonders, dass Sie den HTTP-Header „Vary Response“ verwenden müssen, wenn Ihr Server je nach anderen Headern unterschiedliche Inhalte für dieselbe URL rendern kann. Wenn Ihr Server beispielsweise den vollständigen HTML-Code rendert, wenn Request.IsHtmx() „false“ ist, und ein Fragment dieses HTML-Codes, wenn Request.IsHtmx() „true“ ist, müssen Sie Vary: HX-Request hinzufügen. Dies führt dazu, dass der Cache auf der Grundlage einer Kombination aus der Antwort-URL und dem HX-Request-Anforderungsheader verschlüsselt wird – und nicht nur auf der Antwort-URL.
// in a Razor Page
if ( Request . IsHtmx ( ) )
{
Response . Headers . Add ( " Vary " , " HX-Request " ) ;
return Partial ( " _Form " , this )
}
return Page ( ) ;
Wir können HTTP-Antwortheader mithilfe der Htmx
Erweiterungsmethode festlegen, die eine Aktion und ein HtmxResponseHeaders
-Objekt übergibt.
Response . Htmx ( h => {
h . PushUrl ( " /new-url " )
. WithTrigger ( " cool " )
} ) ;
Weitere Informationen zu den HTTP-Antwortheadern finden Sie auf der offiziellen Dokumentationsseite.
Sie können clientseitige Ereignisse mit HTMX mithilfe des HX-Trigger
Headers auslösen. Htmx.Net bietet eine WithTrigger
Hilfsmethode zum Konfigurieren eines oder mehrerer Ereignisse, die Sie auslösen möchten.
Response . Htmx ( h => {
h . WithTrigger ( " yes " )
. WithTrigger ( " cool " , timing : HtmxTriggerTiming . AfterSettle )
. WithTrigger ( " neat " , new { valueForFrontEnd = 42 , status = " Done! " } , timing : HtmxTriggerTiming . AfterSwap ) ;
} ) ;
Standardmäßig werden alle Htmx-Anfragen und -Antworten in einem Cross-Origin-Kontext blockiert.
Wenn Sie Ihre Anwendung in einem Cross-Origin-Kontext konfigurieren, können Sie durch das Festlegen einer CORS-Richtlinie in ASP.NET Core auch spezifische Einschränkungen für Anforderungs- und Antwortheader definieren und so eine differenzierte Kontrolle über die Daten ermöglichen, die zwischen Ihrem Web ausgetauscht werden können Anwendung und unterschiedliche Herkunft.
Diese Bibliothek bietet einen einfachen Ansatz zum Offenlegen von Htmx-Headern für Ihre CORS-Richtlinie:
var MyAllowSpecificOrigins = " _myAllowSpecificOrigins " ;
var builder = WebApplication . CreateBuilder ( args ) ;
builder . Services . AddCors ( options =>
{
options . AddPolicy ( name : MyAllowSpecificOrigins ,
policy =>
{
policy . WithOrigins ( " http://example.com " , " http://www.contoso.com " )
. WithHeaders ( HtmxRequestHeaders . Keys . All ) // Add htmx request headers
. WithExposedHeaders ( HtmxResponseHeaders . Keys . All ) // Add htmx response headers
} ) ;
} ) ;
Installieren Sie das NuGet-Paket Htmx.TagHelpers
in Ihrem ASP.NET Core-Projekt. Zielt auf .NET Core 3.1+-Projekte ab.
dotnet add package Htmx.TagHelpers
Machen Sie die Tag-Hilfsprogramme in Ihrem Projekt verfügbar, indem Sie die folgende Zeile zu Ihrer _ViewImports.cshtml
hinzufügen:
@addTagHelper *, Htmx.TagHelpers
Im Allgemeinen benötigen Sie URL-Pfade, die auf Ihr ASP.NET Core-Backend verweisen. Glücklicherweise ahmt Htmx.TagHelpers
die in ASP.NET Core enthaltene URL-Generierung nach. Dadurch wird die Verknüpfung von HTMX mit Ihrer ASP.NET Core-Anwendung zu einem nahtlosen Erlebnis.
< div hx-target =" this " >
< button hx-get
hx-page =" Index "
hx-page-handler =" Snippet "
hx-swap =" outerHtml " >
Click Me (Razor Page w/ Handler)
</ button >
</ div >
< div hx-target =" this " >
< button hx-get
hx-controller =" Home "
hx-action =" Index "
hx-route-id =" 1 " >
Click Me (Controller)
</ button >
</ div >
< div hx-target =" this " >
< button hx-post
hx-route =" named " >
Click Me (Named)
</ button >
</ div >
Ein zusätzlicher htmx-config
Tag-Helfer ist enthalten, der auf ein meta
im head
Ihrer Seite angewendet werden kann und das Erstellen der HTMX-Konfiguration einfacher macht. Im Folgenden können wir beispielsweise den historyCacheSize
und die Standard- indicatorClass
festlegen und festlegen, ob die Fälschungsschutztoken von ASP.NET Core als zusätzliches Element in die HTMX-Konfiguration einbezogen werden sollen.
<!DOCTYPE html >
< html lang =" en " >
< head >
< meta name =" htmx-config "
historyCacheSize =" 20 "
indicatorClass =" htmx-indicator "
includeAspNetAntiforgeryToken =" true "
/>
<!-- additional elements... -->
</ head >
Der resultierende HTML-Code wird sein.
<!DOCTYPE html >
< html lang =" en " >
< head >
< meta name =" htmx-config " content =' {"indicatorClass":"htmx-indicator","historyCacheSize":20,"antiForgery":{"formFieldName":"__RequestVerificationToken","headerName":"RequestVerificationToken","requestToken":"<token>"}} ' />
<!-- additional elements... -->
</ head >
Sie können das Attribut includeAspNetAntiforgerToken
für das htmx-config
Element festlegen. Dann müssen Sie dieses zusätzliche JavaScript in Ihre Webanwendung einbinden. Wir fügen das Attribut __htmx_antiforgery
hinzu, um zu verfolgen, dass der Ereignis-Listener bereits hinzugefügt wurde. Dies verhindert, dass wir den Ereignis-Listener versehentlich erneut registrieren.
if ( ! document . body . attributes . __htmx_antiforgery ) {
document . addEventListener ( "htmx:configRequest" , evt => {
let httpVerb = evt . detail . verb . toUpperCase ( ) ;
if ( httpVerb === 'GET' ) return ;
let antiForgery = htmx . config . antiForgery ;
if ( antiForgery ) {
// already specified on form, short circuit
if ( evt . detail . parameters [ antiForgery . formFieldName ] )
return ;
if ( antiForgery . headerName ) {
evt . detail . headers [ antiForgery . headerName ]
= antiForgery . requestToken ;
} else {
evt . detail . parameters [ antiForgery . formFieldName ]
= antiForgery . requestToken ;
}
}
} ) ;
document . addEventListener ( "htmx:afterOnLoad" , evt => {
if ( evt . detail . boosted ) {
const parser = new DOMParser ( ) ;
const html = parser . parseFromString ( evt . detail . xhr . responseText , 'text/html' ) ;
const selector = 'meta[name=htmx-config]' ;
const config = html . querySelector ( selector ) ;
if ( config ) {
const current = document . querySelector ( selector ) ;
// only change the anti-forgery token
const key = 'antiForgery' ;
htmx . config [ key ] = JSON . parse ( config . attributes [ 'content' ] . value ) [ key ] ;
// update DOM, probably not necessary, but for sanity's sake
current . replaceWith ( config ) ;
}
}
} ) ;
document . body . attributes . __htmx_antiforgery = true ;
}
Sie können auf zwei Arten auf das Snippet zugreifen. Die erste besteht darin, die statische Klasse HtmxSnippet
in Ihren Ansichten zu verwenden.
<script>
@Html.Raw(HtmxSnippets.AntiforgeryJavaScript)
</script>
Eine einfachere Möglichkeit besteht darin, die HtmlExtensions
-Klasse zu verwenden, die IHtmlHelper
erweitert.
@Html.HtmxAntiforgeryScript()
Dieser HTML-Helfer führt zu einem <script>
-Tag zusammen mit dem zuvor erwähnten JavaScript. Hinweis: Sie können weiterhin mehrere Event-Handler für htmx:configRequest
registrieren, daher ist es in Ordnung, mehr als einen zu haben.
Beachten Sie Folgendes: Wenn sich das hx-[get|post|put]
-Attribut auf einem <form ..>
-Tag befindet und das <form>
-Element ein method="post"
-Attribut (und auch ein leeres oder fehlendes action=""
)-Attribut hat, Die ASP.NET-Tag-Hilfsprogramme fügen das Anti-Forgery-Token als input
hinzu und Sie müssen Ihre Anforderungen nicht wie oben beschrieben weiter konfigurieren. Sie könnten auch hx-include
verwenden, um auf ein Formular zu verweisen, aber das hängt alles von Ihren Vorlieben ab.
Darüber hinaus besteht der empfohlene Ansatz darin, HtmxAntiforgeryScriptEndpoint
zu verwenden, mit dem Sie die JavaScript-Datei einem bestimmten Endpunkt zuordnen können. Standardmäßig ist dies _htmx/antiforgery.js
.
app . UseAuthorization ( ) ;
// registered here
app . MapHtmxAntiforgeryScript ( ) ;
app . MapRazorPages ( ) ;
app . MapControllers ( ) ;
Sie können diesen Endpunkt jetzt mit Caching, Authentifizierung usw. konfigurieren. Noch wichtiger ist, dass Sie das Skript jetzt in Ihrem head
-Tag verwenden können, indem Sie das defer
-Tag anwenden, das besser ist als JavaScript am Ende eines body
-Elements.
< head >
< meta charset =" utf-8 "/>
< meta name =" viewport " content =" width=device-width, initial-scale=1.0 "/>
< meta
name =" htmx-config "
historyCacheSize =" 20 "
indicatorClass =" htmx-indicator "
includeAspNetAntiforgeryToken =" true "/>
< title > @ViewData["Title"] - Htmx.Sample </ title >
< link rel =" stylesheet " href =" ~/lib/bootstrap/dist/css/bootstrap.min.css "/>
< link rel =" stylesheet " href =" ~/css/site.css " asp-append-version =" true "/>
< script src =" ~/lib/jquery/dist/jquery.min.js " defer > </ script >
< script src =" ~/lib/bootstrap/dist/js/bootstrap.bundle.min.js " defer > </ script >
< script src =" https://unpkg.com/htmx.org@@1.9.2 " defer > </ script >
<!-- this uses the static value in a script tag -->
< script src =" @HtmxAntiforgeryScriptEndpoints.Path " defer > </ script >
</ head >
Urheberrecht © 2022 Khalid Abuhakmeh
Hiermit wird jeder Person, die eine Kopie dieser Software und der zugehörigen Dokumentationsdateien (die „Software“) erhält, kostenlos die Erlaubnis erteilt, mit der Software ohne Einschränkung zu handeln, einschließlich und ohne Einschränkung der Rechte zur Nutzung, zum Kopieren, Ändern und Zusammenführen , Kopien der Software zu veröffentlichen, zu verteilen, unterzulizenzieren und/oder zu verkaufen und Personen, denen die Software zur Verfügung gestellt wird, dies zu gestatten, vorbehaltlich der folgenden Bedingungen:
Der obige Urheberrechtshinweis und dieser Genehmigungshinweis müssen in allen Kopien oder wesentlichen Teilen der Software enthalten sein.
DIE SOFTWARE WIRD „WIE BESEHEN“ ZUR VERFÜGUNG GESTELLT, OHNE JEGLICHE AUSDRÜCKLICHE ODER STILLSCHWEIGENDE GEWÄHRLEISTUNG, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE GEWÄHRLEISTUNG DER MARKTGÄNGIGKEIT, EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND NICHTVERLETZUNG. IN KEINEM FALL SIND DIE AUTOREN ODER COPYRIGHT-INHABER HAFTBAR FÜR JEGLICHE ANSPRÜCHE, SCHÄDEN ODER ANDERE HAFTUNG, WEDER AUS EINER VERTRAGLICHEN HANDLUNG, AUS HANDLUNG ODER ANDERWEITIG, DIE SICH AUS, AUS ODER IN VERBINDUNG MIT DER SOFTWARE ODER DER NUTZUNG ODER ANDEREN HANDELN IN DER SOFTWARE ERGEBEN SOFTWARE.