Существует ли просмотр в Asp.Net MVC?

Кто-нибудь знает, как можно определить, существует ли определенное имя представления внутри контроллера перед визуализацией представления?

У меня есть требование динамически определять имя представления для рендеринга. Если с этим именем существует представление, мне нужно отобразить это представление. Если в пользовательском имени нет представления, мне нужно отобразить представление по умолчанию.

Я хотел бы сделать что-то похожее на следующий код внутри моего контроллера:

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();
    }
}

Спасибо.

Ответ 1

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

Для тех, кто ищет способ расширения для копирования/вставки:

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);
    }
}

Ответ 2

Как насчет того, чтобы попробовать что-то вроде следующего, предполагая, что вы используете только один механизм просмотра:

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

Ответ 3

Здесь другой [не обязательно рекомендованный] способ сделать это

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

Ответ 4

Если вы хотите повторно использовать это для нескольких действий контроллера, опираясь на решение, данное Dave, вы можете определить результат пользовательского просмотра следующим образом:

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);
    }

    ...
}

Затем в вашем действии просто верните экземпляр своего пользовательского представления:

public ActionResult Index()
{ 
    return new CustomViewResult();
}

Ответ 5

ViewEngines.Engines.FindView(ViewContext.Controller.ControllerContext, "View Name").View != null

Мои 2 цента.