Minha principal motivação para tentar fazer isso é obter o Javascript que só é exigido por uma parcial na parte inferior da página com o restante do Javascript e não no meio da página onde a parcial é renderizada.
Aqui está um exemplo simplificado do que estou tentando fazer:
Aqui está o layout com uma seção de Scripts logo antes do corpo.
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
</head>
<body>
@RenderBody()
<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
@RenderSection("Scripts", false)
</body>
</html>
Aqui está um exemplo de visualização usando este layout.
<h2>This is the view</h2>
@{Html.RenderPartial("_Partial");}
@section Scripts {
<script type="text/javascript">
alert("I'm a view.");
</script>
}
E aqui está o parcial sendo renderizado a partir da vista.
<p>This is the partial.</p>
@* this never makes it into the rendered page *@
@section Scripts {
<script type="text/javascript">
alert("I'm a partial.");
</script>
}
Neste exemplo, a marcação especificada na vista é colocada na seção, mas a marcação parcial não é. É possível preencher uma seção de uma visualização parcial com o Razor? Se não, quais são alguns outros métodos de obtenção de Javascript que são necessários apenas para parciais na parte inferior da página, sem incluí-lo globalmente?
fonte
Respostas:
A maneira como lidei com isso é escrever alguns métodos de extensão para a classe HtmlHelper. Isso permite que as visualizações parciais digam que precisam de um script e, em seguida, na visualização de layout que grava a tag, chamo meu método auxiliar para emitir os scripts necessários
Aqui estão os métodos auxiliares:
Depois de ter isso no lugar, sua visão parcial só precisa ser ativada
@Html.RequireScript("/Path/To/Script")
.E na seção principal da visualização de layout você chama
@Html.EmitRequiredScripts()
.Um bônus adicional disso é que ele permite eliminar solicitações de script duplicadas. Se você tiver múltiplas visões / visões parciais que precisam de um dado script, você pode assumir com segurança que só o produzirá uma vez
fonte
Vistas parciais não podem participar das seções de suas vistas-pai.
fonte
Você poderia ter uma segunda parcial encarregada apenas de injetar o javascript necessário. Coloque vários scripts em torno dos
@if
blocos, se quiser:Isso obviamente poderia ser um pouco limpo, mas então, na
Scripts
seção de sua visão:Novamente, pode não ganhar um prêmio de beleza, mas funcionará.
fonte
A maneira mais elegante de fazer isso é mover scripts de visualização parcial para um arquivo separado e, em seguida, renderizá-lo na seção Scripts de visualização:
A visão parcial _ Partial.cshtml :
A visão parcial _ PartialScripts.cshtml apenas com scripts:
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
[Versão atualizada] Versão atualizada após a pergunta @Necrocubus para incluir scripts embutidos.
Meus 2 centavos, é um post antigo, mas ainda relevante, então aqui está uma atualização atualizada da solução do Sr. Bell que funciona com ASP.Net Core.
Ele permite adicionar scripts e estilos ao layout principal a partir de visualizações parciais e subvisualizações importadas e a possibilidade de adicionar opções às importações de script / estilo (como adiamento assíncrono etc):
fonte
<text>
, apenas adicione-o como uma string (você ainda pode prefixar com @ "" para várias linhas, se preferir) e sem as<script>
tagsVocê pode criar uma nova
Layout
página e envolver o PartialView dentro de um Full View que é responsável por renderizar o conteúdo e também quaisquer seções da biblioteca.Por exemplo, digamos que eu tenha o seguinte código:
HomeController.cs
Quando a visualização de página inteira é renderizada, normalmente é renderizada pela fusão de dois arquivos:
About.cshtml
_Layout.cshtml
(ou o que for especificado em _ViewStart ou substituído na página)Agora , suponha que você queira renderizar
About.cshtml
como uma visualização parcial , talvez como uma janela modal em resposta à chamada AJAX. O objetivo aqui é retornar apenas o conteúdo especificado na página sobre, scripts e tudo, sem todo o inchaço incluído no_Layout.cshtml
layout mestre (como um<html>
documento ).Você pode tentar assim, mas não virá com nenhum dos blocos de seção:
Em vez disso, adicione uma página de layout mais simples como esta:
_PartialLayout.cshtml
Ou para suportar uma janela modal como esta:
_ModalLayout.cshtml
Então você pode especificar uma Visão Mestre personalizada neste controlador ou qualquer outro manipulador que você deseja renderizar o conteúdo e scripts de uma visão simultaneamente
fonte
Para quem procura a versão aspnet core 2.0:
Adicione ao seu layout após a chamada da seção de renderização dos scripts:
E em sua visão parcial:
fonte
Com base na resposta do Sr. Bell e Shimmy acima, adicionei uma função extra para o script Bundle.
Amostra em PartialView: - @ Html.RequireBundleStyles ("~ / bundles / fileupload / bootstrap / BasicPlusUI / css"); @ Html.RequireBundleScripts ("~ / bundles / fileupload / bootstrap / BasicPlusUI / js");
Amostra na MasterPage: - @ Html.EmitRequiredBundleStyles ()
fonte
Use as
@using(Html.Delayed()){ ...your content... }
extensões da resposta https://stackoverflow.com/a/18790222/1037948 para renderizar qualquer conteúdo (scripts ou apenas HTML) posteriormente na página. InternoQueue
deve garantir o pedido correto.fonte
Essa funcionalidade também é implementada em ClientDependency.Core.Mvc.dll. Ele fornece os auxiliares de html: @ Html.RequiresJs e @ Html.RenderJsHere (). Pacote Nuget: ClientDependency-Mvc
fonte
Aqui vem minha solução para as perguntas mais frequentes "como injetar seções de visualizações parciais em visualizações principais ou visualização de layout principal para asp.net mvc?". Se você fizer uma pesquisa sobre stackoverflow por palavras-chave "seção + parcial", obterá uma lista bastante grande de perguntas relacionadas e respostas dadas, mas nenhuma delas parece elegante para mim por meio da gramática do mecanismo de navalha. Então, eu só dei uma olhada no motor do Razor para ver se poderia haver uma solução melhor para essa questão.
Felizmente, encontrei algo interessante para mim de como o mecanismo do Razor faz a compilação do arquivo de modelo de visão (* .cshtml, * .vbhtml). (Explicarei mais tarde), abaixo está meu código da solução que eu acho bastante simples e elegante no uso.
uso : Usar o código também é bastante simples e parece quase o mesmo estilo do usual. Ele também oferece suporte a qualquer nível para as visualizações parciais aninhadas. ie. Eu tenho uma cadeia de modelo de exibição: _ViewStart.cshtml-> layout.cshtml-> index.cshtml -> [head.cshtml, foot.cshtml] -> ad.cshtml.
Em layout.cshtml, temos:
E em index.cshtml, temos:
E em head.cshtml, teríamos o código:
é o mesmo em foot.cshtml ou ad.cshtml, você ainda pode definir a seção Head ou Foot neles, certifique-se de chamar @ Html.EnsureSection () uma vez no final do arquivo de visualização parcial. Isso é tudo que você precisa fazer para se livrar do problema exposto no asp mvc.
Acabei de compartilhar meu snippet de código para que outros possam usá-lo. Se você acha que é útil, por favor, não hesite em avaliar minha postagem. :)
fonte