Существует ли представление в ASP.NET MVC? - PullRequest
92 голосов
/ 04 июня 2009

Можно ли определить, существует ли конкретное имя представления в контроллере, перед его отображением?

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

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

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

Ответы [ 5 ]

148 голосов
/ 04 июня 2009
 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);
    }
}
18 голосов
/ 04 июня 2009

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

bool viewExists = ViewEngines.Engines[0].FindView(ControllerContext, "ViewName", "MasterName", false) != null;
7 голосов
/ 09 мая 2013

Вот еще один [не обязательно рекомендуемый] способ сделать это

 try
 {
     @Html.Partial("Category/SearchPanel/" + Model.CategoryKey)
 }
 catch (InvalidOperationException) { }
2 голосов
/ 04 июня 2009

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

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();
}
1 голос
/ 16 июня 2015
ViewEngines.Engines.FindView(ViewContext.Controller.ControllerContext, "View Name").View != null

Мои 2 цента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...