Razor: @ Html.Partial () vs @RenderPage ()

93

Qual é a maneira apropriada de renderizar um modelo filho?

E qual é a diferença? Ambos parecem funcionar para mim.

E por que @Html.RenderPartial()não funciona mais?

Evgenyt
fonte

Respostas:

127
Html.Partial("MyView")

Renderiza a visualização "MyView" para um MvcHtmlString. Ele segue as regras padrão para visualização de visualização (ou seja, verifique o diretório atual e, em seguida, verifique o Shareddiretório).

Html.RenderPartial("MyView")

Faz o mesmo que Html.Partial(), exceto que grava sua saída diretamente no fluxo de resposta. Isso é mais eficiente, porque o conteúdo da visualização não é armazenado em buffer na memória. No entanto, como o método não retorna nenhuma saída, @Html.RenderPartial("MyView")não funcionará. Você tem que quebrar a chamada em um bloco de código em vez disso: @{Html.RenderPartial("MyView");}.

RenderPage("MyView.cshtml")

Processa a visualização especificada (identificada pelo caminho e nome do arquivo em vez do nome da visualização) diretamente para o fluxo de resposta, como Html.RenderPartial(). Você pode fornecer qualquer modelo que desejar para a visualização, incluindo-o como um segundo parâmetro

RenderPage("MyView.cshtml", MyModel)
Annabelle
fonte
8
Existe alguma métrica sobre o ganho de eficiência de @ {Html.RenderPartial ("MyView");} em relação a @ Html.RenderPartial ("MyView")?
Faust,
@Faust, você quis dizer Partial vd RenderPartial?
Cacho Santa
1
@cacho: sim, meu comentário deve ser @Html.Partial("MyView")vs.@{Html.RenderPartial("MyView");}
Faust
2
Pequena correção: o segundo parâmetro em RenderPage () não é o modelo, é um objeto param [] que é acessado através da propriedade PageData. Parece funcionar como acima porque, por padrão, o modelo da página "pai" é passado para o "filho". msdn.microsoft.com/en-us/library/…
Jon
Existe uma maneira de aninhar uma página completa ao longo de seu modelo chamando RenderPage? Desejo aninhar uma página diferente especificando um parâmetro de consulta específico, que por sua vez filtraria os dados nessa página e, além disso, removeria seu próprio layout.
Shimmy Weitzhandler
17

eu prefiro

@RenderPage("_LayoutHeader.cshtml")

Sobre

@{ Html.RenderPartial("_LayoutHeader"); }

Só porque a sintaxe é mais fácil e mais legível. Fora isso, não parece haver nenhuma diferença em termos de funcionalidade.

EDIT: Uma vantagem do RenderPartial é que você não precisa especificar o caminho inteiro ou a extensão do arquivo, ele pesquisará os lugares comuns automaticamente.

Ryan Sampson
fonte
1
Acho que isso deve ser um comentário, não uma resposta. Também concordo por RenderPagecausa da sintaxe.
Iman Mahmoudinasab
6

O método RenderPartial não retorna marcação HTML como a maioria dos outros métodos auxiliares. Em vez disso, ele grava conteúdo diretamente no fluxo de resposta, por isso devemos chamá-lo como uma linha completa de C #, usando um ponto-e-vírgula.

Isso é um pouco mais eficiente do que armazenar em buffer o HTML renderizado da visualização parcial, já que ele será gravado no fluxo de resposta de qualquer maneira. Se você preferir uma sintaxe mais consistente, pode usar o método Html.Partial , que faz exatamente o mesmo que o método RenderPartial , mas retorna um fragmento HTML e pode ser usado como @Html.Partial ("Product", p).

Omid Shariati
fonte
2

Também podemos passar o modelo usando vistas parciais. @ Html.Partial ("MyView", "MyModel");

Bayram
fonte
0
@RenderPages() 

O acima não funciona na ASP.NET MVC. Ele só funciona em páginas da web.

@Html.Partial("_Footer")

Você precisará usar o acima na ASP.NET MVC.

Umar Aftab
fonte