Eu tenho esta seção definida no meu _Layout.cshtml
@RenderSection("Scripts", false)
Eu posso usá-lo facilmente de uma vista:
@section Scripts {
@*Stuff comes here*@
}
O que estou enfrentando é como injetar algum conteúdo nesta seção a partir de uma exibição parcial.
Vamos assumir que esta é minha página de visualização:
@section Scripts {
<script>
//code comes here
</script>
}
<div>
poo bar poo
</div>
<div>
@Html.Partial("_myPartial")
</div>
Preciso injetar algum conteúdo dentro da Scripts
seção da _myPartial
vista parcial.
Como posso fazer isso?
Respostas:
As seções não funcionam em vistas parciais e isso é por design. Você pode usar alguns auxiliares personalizados para obter um comportamento semelhante, mas, honestamente, é responsabilidade da exibição incluir os scripts necessários, não a responsabilidade da parte. Eu recomendaria usar a seção @scripts da exibição principal para fazer isso e não deixar as partes parciais se preocuparem com os scripts.
fonte
Essa é uma pergunta bastante popular, então postarei minha solução.
Eu tive o mesmo problema e, embora não seja o ideal, acho que realmente funciona muito bem e não torna a parcial dependente da exibição.
Meu cenário era que uma ação era acessível por si só, mas também poderia ser incorporada em uma visualização - um mapa do Google.
No meu
_layout
eu tenho:Na minha
index
opinião, tenho:Na minha
clients
opinião, eu tenho (todo o mapa e assoc. Html):Minha
Clients_Scripts
visão contém o javascript a ser renderizado na páginaDessa maneira, meu script é isolado e pode ser renderizado na página quando necessário, com a
body_scripts
tag sendo renderizada apenas na primeira ocorrência que o mecanismo de exibição do razor encontra.Isso me permite separar tudo - é uma solução que funciona muito bem para mim, outras pessoas podem ter problemas com isso, mas corrige o buraco "por design".
fonte
Das soluções neste segmento , criei a seguinte solução provavelmente super complicada que permite atrasar a renderização de qualquer html (scripts também) dentro de um bloco usando
USO
Crie a "seção"
Cenário típico: em uma vista parcial, inclua o bloco apenas uma vez, não importa quantas vezes a vista parcial seja repetida na página:
Em uma exibição parcial, inclua o bloco para cada vez que a parcial for usada:
Em uma exibição parcial, inclua o bloco apenas uma vez, não importa quantas vezes o parcial seja repetido, mas depois o processe especificamente pelo nome
when-i-call-you
:Renderize as "seções"
(ou seja, exibir a seção atrasada na visualização principal)
CÓDIGO
fonte
isOnlyOne
, mas somente se você deseja renderizá-lo em um local específico por nome, fornece o identificador, caso contrário, é descartadoHtml.RenderDelayed()
.Eu tive esse problema e usei essa técnica.
É a melhor solução que encontrei, que é muito flexível.
Também vote aqui para adicionar suporte à declaração de seção cumulativa
fonte
Se você tem uma necessidade legítima de executar alguns
js
de apartial
, veja como você pode fazê-lojQuery
:fonte
Seguindo o princípio discreto , não é necessário que "_myPartial" injete conteúdo diretamente na seção de scripts. Você pode adicionar esses scripts de exibição parcial em um
.js
arquivo separado e referenciá-los na seção @scripts da exibição pai.fonte
Há uma falha fundamental na maneira como pensamos sobre a web, especialmente ao usar o MVC. A falha é que o JavaScript é de alguma forma a responsabilidade da visualização. Uma visão é uma visão, JavaScript (comportamental ou não) é JavaScript. No padrão MVVM do Silverlight e do WPF, somos confrontados com "visualizar primeiro" ou "modelo primeiro". No MVC, devemos sempre tentar argumentar do ponto de vista do modelo e o JavaScript faz parte desse modelo de várias maneiras.
Eu sugeriria o uso do padrão AMD (eu mesmo gosto do RequireJS ). Separe seu JavaScript em módulos, defina sua funcionalidade e conecte-se a seu html a partir do JavaScript, em vez de confiar em uma visualização para carregar o JavaScript. Isso limpará seu código, separará suas preocupações e facilitará a vida de uma só vez.
fonte
window
objeto e incluo scripts de biblioteca antes de quaisquer parciais.O objetivo do OP é que ele queira definir scripts embutidos em sua Vista Parcial, que eu assumo que esse script seja específico apenas para essa Vista Parcial e tenha esse bloco incluído na seção de scripts.
Entendo que ele deseja que essa Vista Parcial seja independente. A ideia é semelhante aos componentes ao usar Angular.
Minha maneira seria apenas manter os scripts dentro da Vista Parcial como está. Agora, o problema disso é quando se chama Partial View, ele pode executar o script lá antes de todos os outros scripts (que geralmente são adicionados à parte inferior da página de layout). Nesse caso, você apenas tem o script Partial View aguardando os outros scripts. Existem várias maneiras de fazer isso. O mais simples, que eu já usei antes, está usando um evento
body
.No meu layout, eu teria algo no fundo assim:
Então, na minha Vista Parcial (na parte inferior):
Outra solução é usar uma pilha para enviar todos os seus scripts e chamar cada um no final. Outra solução, como já mencionado, é o padrão RequireJS / AMD, que também funciona muito bem.
fonte
A primeira solução em que consigo pensar é usar o ViewBag para armazenar os valores que devem ser renderizados.
Inicialmente, eu nunca tentei se este trabalho de uma visão parcial, mas deveria imo.
fonte
ViewBag.RenderScripts = new List<string>();
no topo da página principal, então chamado@Html.Partial("_CreateUpdatePartial",Model,ViewData)
, em seguida, colocar@section Scripts {@foreach (string script in ViewBag.RenderScripts) Scripts.Render(script); }}
em vista parcial Coloquei.@{ViewBag.RenderScripts = ViewBag.RenderScripts ?? new List<string>();ViewBag.RenderScripts.Add("~/bundles/jquery");}
.Você não precisa usar seções em vista parcial.
Incluir em sua vista parcial. Ele executa a função após o jQuery carregado. Você pode alterar a cláusula de condição para seu código.
Julio Spader
fonte
Você pode usar estes métodos de extensão : (Salvar como PartialWithScript.cs)
Use assim:
Exemplo parcial: (_MyPartial.cshtml) Coloque o html no if e os js no else.
No seu _Layout.cshtml, ou onde você quiser que os scripts das parciais sejam renderizados, coloque o seguinte (uma vez): Ele renderizará apenas o javascript de todas as parciais na página atual neste local.
Para usar o seu parcial, basta fazer o seguinte: Ele renderizará apenas o html neste local.
fonte
Existe uma maneira de inserir seções em vistas parciais, embora não seja bonito. Você precisa ter acesso a duas variáveis na tela pai. Como parte do objetivo de sua visão parcial é criar essa seção, faz sentido exigir essas variáveis.
Veja como é inserir uma seção na vista parcial:
E na página inserindo a vista parcial ...
Você também pode usar esta técnica para definir o conteúdo de uma seção programaticamente em qualquer classe.
Aproveitar!
fonte
A idéia de Plutão de uma maneira mais agradável:
CustomWebViewPage.cs:
Views \ web.config:
Visão:
Parcial (_BackendSearchForm.cshtml):
Página de layout:
fonte
Isso funcionou para mim, permitindo-me co-localizar javascript e html para exibição parcial no mesmo arquivo. Ajuda no processo de pensamento para ver html e parte relacionada no mesmo arquivo de exibição parcial.
No modo de exibição que usa o modo de exibição parcial chamado "_MyPartialView.cshtml"
No arquivo Vista parcial
fonte
Eu resolvi essa rota completamente diferente (porque estava com pressa e não queria implementar um novo HtmlHelper):
Embrulhei minha Vista Parcial em uma grande declaração if-else:
Em seguida, chamei o Partial duas vezes com um ViewData personalizado:
fonte
@Html.Partial("MyPartialViewScripts")
Eu tive um problema semelhante, onde eu tinha uma página mestra da seguinte maneira:
mas a exibição parcial dependia de algum JavaScript na seção Scripts. Eu o resolvi codificando a exibição parcial como JSON, carregando-a em uma variável JavaScript e usando-a para preencher uma div, portanto:
fonte
Como opção, você pode usar uma pasta / index.cshtml como uma página principal e adicionar scripts de seção. Então, no seu layout, você tem:
e seu index.cshtml:
e funcionará em todas as suas visualizações parciais. Funciona para mim
fonte
Usando o Mvc Core, você pode criar um TagHelper organizado,
scripts
como mostrado abaixo. Isso pode ser facilmente transformado em umasection
tag na qual você também atribui um nome (ou o nome é retirado do tipo derivado). Observe que a injeção de dependência precisa ser configurada paraIHttpContextAccessor
.Ao adicionar scripts (por exemplo, em parcial)
Ao emitir os scripts (por exemplo, em um arquivo de layout)
Código
fonte
Eu tive um problema quase idêntico no outro dia, exceto que a exibição parcial era uma resposta a uma solicitação AJAX. Na minha situação, o parcial era na verdade uma página inteira, mas eu queria que ele fosse acessível como um parcial de outras páginas.
Se você deseja renderizar seções parcialmente, a solução mais limpa é criar um novo layout e usar uma variável ViewBag. Isso não funciona com
@Html.Partial()
o novo<partial></partial>
, use o AJAX.Vista principal (que você deseja que seja processada como parcial em outro lugar):
Controlador:
_layoutPartial.cshtml (novo):
Em seguida, use o AJAX em sua página.
Se você deseja renderizar a página no layout principal (não parcial), não defina
ViewBag.Partial = true
. Não é necessário nenhum auxiliar de HTML.fonte
Bem, acho que os outros pôsteres forneceram a você um meio de incluir diretamente uma seção @ na sua parcial (usando ajudantes html de terceiros).
Mas eu acho que, se o seu script estiver fortemente acoplado ao seu parcial, basta colocar seu javascript diretamente dentro de uma
<script>
tag embutida dentro do seu parcial e terminar com ele (tenha cuidado com a duplicação de script se você pretende usar o parcial mais de uma vez em uma única visualização);fonte
suponha que você tenha uma visualização parcial chamada _contact.cshtml, seu contato pode ser um assunto legal (nome) ou físico (nome e sobrenome). sua visão deve cuidar do que é renderizado e que pode ser obtido com javascript. pode ser necessário renderização atrasada e JS dentro da visualização.
a única maneira que penso, como isso pode ser omitido, é quando criamos uma maneira discreta de lidar com essas preocupações da interface do usuário.
observe também que o MVC 6 terá o chamado View Component, mesmo os futuros do MVC tinham coisas semelhantes e a Telerik também suporta isso ...
fonte
Acabei de adicionar esse código na minha visão parcial e resolvi o problema, embora não muito limpo, ele funciona. Você precisa se certificar dos IDs dos objetos que está renderizando.
fonte
Eu tive o problema semelhante resolvido com isso:
Essa é uma maneira bonita de injetar eu acho.
fonte