¿Existe una vista en Asp.Net MVC?

¿Alguien sabe cómo es posible determinar si existe un nombre de vista específico dentro de un controlador antes de representarlo?

Tengo un requisito para determinar dinámicamente el nombre de la vista para representar. Si existe una vista con ese nombre, entonces necesito renderizar esa vista. Si no hay vista por el nombre personalizado, entonces necesito renderizar una vista predeterminada.

Me gustaría hacer algo similar al siguiente código en mi 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(); } } 

Gracias.

  private bool ViewExists(string name) { ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, name, null); return (result.View != null); } 

Para aquellos que buscan un método de extensión copiar / pegar:

 public static class ControllerExtensions { public static bool ViewExists(this Controller controller, string name) { ViewEngineResult result = ViewEngines.Engines.FindView(controller.ControllerContext, name, null); return (result.View != null); } } 

¿Qué tal si prueba algo como lo siguiente, suponiendo que está utilizando solo un motor de vistas?

 bool viewExists = ViewEngines.Engines[0].FindView(ControllerContext, "ViewName", "MasterName", false) != null; 

Aquí hay otra forma [no necesariamente recomendada] de hacerlo

  try { @Html.Partial("Category/SearchPanel/" + Model.CategoryKey) } catch (InvalidOperationException) { } 

Si desea volver a utilizar esto en varias acciones de controlador, basándose en la solución dada por Dave, puede definir un resultado de vista personalizado de la siguiente manera:

 public class CustomViewResult : ViewResult { protected override ViewEngineResult FindView(ControllerContext context) { string name = SomeMethodToGetViewName(); ViewEngineResult result = ViewEngines.Engines.FindView(context, name, null); if (result.View != null) { return result; } return base.FindView(context); } ... } 

Luego, en su acción simplemente devuelva una instancia de su vista personalizada:

 public ActionResult Index() { return new CustomViewResult(); } 
 ViewEngines.Engines.FindView(ViewContext.Controller.ControllerContext, "View Name").View != null 

Mis 2 centavos.