É possível determinar se um nome de visão específico existe de dentro de um controlador antes de renderizar a visão?
Tenho um requisito para determinar dinamicamente o nome da vista a ser renderizada. Se houver uma visualização com esse nome, preciso renderizá-la. Se não houver visualização com o nome personalizado, preciso renderizar uma visualização padrão.
Eu gostaria de fazer algo semelhante ao seguinte código no meu controlador:
public ActionResult Index()
{
var name = SomeMethodToGetViewName();
// The 'ViewExists' method is what I've been unable to find.
if (ViewExists(name))
{
retun View(name);
}
else
{
return View();
}
}
asp.net-mvc
Andrew Hanson
fonte
fonte
Respostas:
Para quem procura um método de extensão copiar / colar:
fonte
Que tal tentar algo como o seguinte, supondo que você esteja usando apenas um mecanismo de visualização:
fonte
Aqui está outra maneira [não necessariamente recomendada] de fazer isso
fonte
ControllerContext
conforme oFindView
método precisa.Se quiser reutilizar isso em várias ações do controlador, com base na solução fornecida por Dave, você pode definir um resultado de visualização personalizado da seguinte maneira:
Então, em sua ação, basta retornar uma instância de sua visualização personalizada:
fonte
Meus 2 centavos.
fonte
No asp.net core 2.x o
ViewEngines
propriedade não existe mais, então temos que usar oICompositeViewEngine
serviço. Esta é uma variante da resposta aceita usando injeção de dependência:Para os curiosos: A interface base
IViewEngine
não está registrada como um serviço, então devemos injetar em seuICompositeViewEngine
lugar. OFindView()
método, entretanto, é fornecido por,IViewEngine
portanto, a variável de membro pode usar a interface base.fonte
Veja como fazer isso no Razor for Core 2.2 etc. Observe que a chamada é "GetView", não "Find View)
fonte