Página Inicial>Relacionado com a programação>Outro código-fonte

Htmx.Config

Está incluído um auxiliar de tag htmx-config adicional que pode ser aplicado a um meta no head da sua página que simplifica a criação da configuração HTMX. Por exemplo, abaixo podemos definir o historyCacheSize , indicatorClass padrão e se devemos incluir os tokens antifalsificação do ASP.NET Core como um elemento adicional na configuração HTMX.

">
 >
< html lang =" en " >
< head >
    < meta name =" htmx-config " 
          historyCacheSize =" 20 "
          indicatorClass =" htmx-indicator "
          includeAspNetAntiforgeryToken =" true "
          />
    
 head >

O HTML resultante será.

">
 >
< html lang =" en " >
< head >
    < meta name =" htmx-config " content =' {"indicatorClass":"htmx-indicator","historyCacheSize":20,"antiForgery":{"formFieldName":"__RequestVerificationToken","headerName":"RequestVerificationToken","requestToken":""}} ' />
    
 head >

HTMX e tokens antifalsificação

Você pode definir o atributo includeAspNetAntiforgerToken no elemento htmx-config . Então você precisará incluir esse JavaScript adicional em seu aplicativo web. Incluímos o atributo __htmx_antiforgery para rastrear se o ouvinte de evento já foi adicionado. Isso nos impede de registrar novamente acidentalmente o ouvinte de evento.

{ 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; }">
 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 ;
}

Você pode acessar o snippet de duas maneiras. A primeira é usar a classe estática HtmxSnippet em suas visualizações.

 

Uma maneira mais simples é usar a classe HtmlExtensions que estende IHtmlHelper .

 @Html.HtmxAntiforgeryScript()

Este auxiliar HTML resultará em uma tag ">

 < 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 >
    
    < script src =" @HtmxAntiforgeryScriptEndpoints.Path " defer >  script >
 head > 

Licença

Direitos autorais © 2022 Khalid Abuhakmeh

É concedida permissão, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o “Software”), para negociar o Software sem restrições, incluindo, sem limitação, os direitos de usar, copiar, modificar, mesclar , publicar, distribuir, sublicenciar e/ou vender cópias do Software e permitir que as pessoas a quem o Software seja fornecido o façam, sujeito às seguintes condições:

O aviso de direitos autorais acima e este aviso de permissão serão incluídos em todas as cópias ou partes substanciais do Software.

O SOFTWARE É FORNECIDO “COMO ESTÁ”, SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM HIPÓTESE ALGUMA OS AUTORES OU DETENTORES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.

Expandir
Informações adicionais
  • Versão 1.8.0
  • Tipo Outro código-fonte
  • Data da Última Atualização 2024-12-02
  • tamanho 1.68MB
  • Idioma Chinês Simplificado