100 votes

Une vue existe-t-elle dans Asp.Net MVC?

Est-ce que quelqu'un sait s'il est possible de déterminer si un nom de vue spécifique existe dans un contrôleur avant de rendre la vue?

J'ai l'obligation de déterminer dynamiquement le nom de la vue à rendre. Si une vue existe avec ce nom, je dois alors rendre cette vue. S'il n'y a pas de vue par nom personnalisé, je dois alors rendre une vue par défaut.

Je voudrais faire quelque chose de similaire au code suivant dans mon contrôleur:

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

Merci.

163voto

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

20voto

Lance Harper Points 1622

Pourquoi ne pas essayer ce qui suit, en supposant que vous n’utilisez qu’un seul moteur de vue:

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

8voto

Simon_Weaver Points 31141

Voici une autre façon de le faire (pas nécessairement recommandée)

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

3voto

DSO Points 5942

Si vous souhaitez réutiliser cela dans plusieurs actions de contrôleur, en vous basant sur la solution fournie par Dave, vous pouvez définir un résultat de vue personnalisé comme suit:

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

    ...
}
 

Ensuite, dans votre action, renvoyez simplement une instance de votre vue personnalisée:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X