Maneira correta de usar _viewstart.cshtml e visualizações parciais do Razor?

156

Estou usando _viewstart.cshtml para atribuir automaticamente o mesmo Layout do Razor aos meus pontos de vista.

É um arquivo simples na raiz da minha pasta Views que se parece com isso:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

Isso é mais SECO do que adicionar a diretiva @Layout a todas as visualizações.

No entanto, isso representa um problema para o Razor parcial. visualizações , porque elas executam o conteúdo de _viewstart.cshtml e, portanto, atribuem incorretamente a si mesmas um layout, o que as torna, um, não mais parciais.

Aqui está um projeto hipotético, mostrando o arquivo _viewstart.cshtml, o arquivo _layout.shtml compartilhado e uma exibição parcial ("AnonBar.cshtml").

Estrutura de projeto de exemplo

Atualmente, a maneira que eu estou contornando isso é adicionando a seguinte linha a todas as visualizações parciais:

@{
    Layout = "";
}

Esta parece ser a maneira errada de denotar uma visão como parcial no Razor. (Observe que, diferentemente do mecanismo de exibição de formulários da Web, a extensão do arquivo é a mesma para visualizações parciais.)

Outras opções que eu considerei, mas que são ainda piores:

  • Colocar todas as visualizações parciais em uma pasta comum, para que eles possam compartilhar um _viewstart.cshtml comum. Isso interrompe a convenção de exibições na mesma pasta que seu controlador.
  • Não está usando vistas parciais.

Isso ainda está sendo desenvolvido pela equipe do mecanismo de exibição do Razor, ou estou perdendo um conceito fundamental?

Portman
fonte
3
Desculpe pelo offtopic, mas quais são esses ícones ao lado dos nomes dos arquivos? :) Algum tipo de controle de origem, certo?
Alex
6
@jitbit: VisualSVN
erict

Respostas:

237

Se você for return PartialView()de seus controladores (em vez de return View()), _viewstart.cshtmlnão será executado.

marcind
fonte
6
Aha, não sabia da PartialViewResultturma. Era disso que eu precisava.
Portman
6
Como acompanhamento, descobri que preciso também definir explicitamente o tipo de retorno do método de ação para em PartialViewResultvez do habitual ActionResult.
Portman
2
@Portman, você está vendo problemas quando o tipo de retorno do método de ação não é ActionResult? Estou surpreso que isso seja um problema, porque o tempo de execução do MVC não deve se comportar de maneira diferente nesse caso (ou seja, desde que o tipo retornado pelo método de ação seja ActionResultou qualquer classe derivada dele, as coisas devem funcionar).
marcind
@marcind Recebo um estouro de pilha no w3wp.exe se eu definir o tipo de retorno como ActionResult. Funciona bem se o tipo de retorno for PartialViewResult. Acha que preciso registrar um bug do Connect?
Portman
Soa como um para mim - grite de volta se você enviar um bug do Connect, o votará.
Dav