Существует ли просмотр в 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 цента.