Quero manter todo o meu código JavaScript em uma seção; pouco antes da body
tag de fechamento em minha página de layout mestre e apenas me perguntando o melhor para fazer isso, estilo MVC.
Por exemplo, se eu criar um DisplayTemplate\DateTime.cshtml
arquivo que usa o seletor de DateTime do jQuery UI, então eu incorporaria o JavaScript diretamente nesse modelo, mas ele renderizará no meio da página.
Em minhas visualizações normais, posso apenas usar @section JavaScript { //js here }
e, @RenderSection("JavaScript", false)
em seguida, em meu layout mestre, mas isso não parece funcionar em modelos de exibição / editor - alguma ideia?
Respostas:
Você pode prosseguir com uma conjunção de dois ajudantes:
e então em seu
_Layout.cshtml
:e em algum lugar em algum modelo:
fonte
sections
. Em MVC4, o Bundling pode realmente ser usado e também ajuda a reduzir o tamanho dos scripts.head
tag em vez de no final dabody
tag, porque@Html.RenderScripts()
será executado antes de sua visualização parcial e, portanto, antes@Html.Script()
.Versão modificada da resposta de Darin para garantir o pedido. Também funciona com CSS:
Você pode adicionar recursos JS e CSS como este:
E renderize recursos JS e CSS como este:
Você poderia fazer uma verificação de string para ver se ele começa com script / link para que você não precise definir explicitamente o que cada recurso é.
fonte
Eu enfrentei o mesmo problema, mas as soluções propostas aqui funcionam bem apenas para adicionar referência ao recurso e não são muito adequadas para código JS embutido. Encontrei um artigo muito útil e envolvi todo o meu JS inline (e também as tags de script) em
E na visualização _Layout posicionada
@Html.PageScripts()
antes de fechar a tag 'body'. Funciona como um encanto para mim.Os próprios ajudantes:
fonte
Gostei da solução postada por @ john-w-harding, então combinei com a resposta de @ darin-dimitrov para fazer a seguinte solução provavelmente complicada que permite atrasar a renderização de qualquer html (scripts também) dentro de um bloco em uso.
USO
Em uma visualização parcial repetida, inclua o bloco apenas uma vez:
Em uma vista parcial (repetida?), Inclua o bloco para cada vez que a parcial for usada:
Em uma vista parcial (repetida?), Inclua o bloco uma vez e, posteriormente, renderize-o especificamente pelo nome
one-time
:Para renderizar:
CÓDIGO
fonte
Instale o pacote nuget Forloop.HtmlHelpers - ele adiciona alguns auxiliares para gerenciar scripts em visualizações parciais e modelos de editor.
Em algum lugar do seu layout, você precisa ligar
É aqui que quaisquer arquivos de script e blocos de script serão produzidos na página, então eu recomendo colocá-lo após seus scripts principais no layout e após uma seção de scripts (se você tiver uma).
Se estiver usando o Web Optimization Framework com empacotamento, você pode usar a sobrecarga
para que este método seja usado para escrever arquivos de script.
Agora, sempre que desejar adicionar arquivos de script ou blocos em uma visão, visão parcial ou modelo, basta usar
Os ajudantes garantem que apenas uma referência de arquivo de script seja renderizada se adicionada várias vezes e também garante que os arquivos de script sejam renderizados em uma ordem esperada, ou seja,
fonte
Esse post realmente me ajudou, então pensei em postar minha implementação da ideia básica. Eu introduzi uma função auxiliar que pode retornar tags de script para uso na função @ Html.Resource.
Também adicionei uma classe estática simples para que possa usar variáveis digitadas para identificar um recurso JS ou CSS.
E em uso
Obrigado a @Darin Dimitrov que forneceu a resposta à minha pergunta aqui .
fonte
A resposta dada em Preencher uma seção do Razor de um parcial usando o
RequireScript
HtmlHelper segue o mesmo padrão. Ele também tem a vantagem de verificar e suprimir referências duplicadas para o mesmo URL Javascript e possui um códigopriority
parâmetro que pode ser usado para controlar o pedido.Estendi esta solução adicionando métodos para:
Eu gosto das soluções da Darin e da eth0, porque eles usam o
HelperResult
modelo, que permite blocos de script e CSS, não apenas links para arquivos Javascript e CSS.fonte
Respostas @Darin Dimitrov e @ eth0 para usar com o uso de extensão de pacote:
fonte