49 votes

Ajout d'un sous-répertoire au dossier "View/Shared" en ASP.Net MVC et appel de la vue

Je suis en train de développer un site en utilisant ASP.Net MVC3 avec Razor. Dans le dossier "View/Shared", je veux ajouter un sous-dossier appelé "Partials" où je peux placer toutes mes vues partielles (pour mieux organiser le site).

Je peux le faire sans problème tant que je fais toujours référence au dossier "Partials" lorsque j'appelle les vues (en utilisant Razor) :

@Html.Partial("Partials/{ViewName}")

Ma question est de savoir s'il existe un moyen d'ajouter le dossier "Partials" à la liste que .Net parcourt lorsqu'il recherche une vue. De cette façon, je peux appeler ma vue sans avoir à faire référence au dossier "Partials", comme suit :

@Html.Partial("{ViewName}")

Merci pour votre aide !

66voto

lamarant Points 911

Résolu. Pour ajouter le sous-répertoire "Shared/Partials" que j'ai créé à la liste des emplacements recherchés lorsque l'on essaie de localiser une vue partielle dans Razor en utilisant :

@Html.Partial("{NameOfView}")

Créez d'abord un moteur de vue avec RazorViewEngine comme classe de base et ajoutez vos emplacements de vue comme suit. Encore une fois, je voulais stocker toutes mes vues partielles dans un sous-répertoire "Partials" que j'ai créé dans le répertoire par défaut "Views/Shared" créé par MVC.

public class RDDBViewEngine : RazorViewEngine
{
    private static readonly string[] NewPartialViewFormats = 
    { 
        "~/Views/{1}/Partials/{0}.cshtml",
        "~/Views/Shared/Partials/{0}.cshtml"
    };

    public RDDBViewEngine()
    {
        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
    }       

}

Notez que {1} dans le format d'emplacement est le nom du contrôleur et {0} est le nom de la vue.

Ajoutez ensuite ce moteur de vue à la collection MVC ViewEngines.Engines dans la méthode Application_Start() de votre global.asax :

ViewEngines.Engines.Add(new RDDBViewEngine());

29voto

David Cabiness Points 181

Merci pour vos réponses. Cela a organisé mon dossier partagé, mais pourquoi créer un nouveau type de moteur de vue ? Je viens de créer un nouveau RazorViewEngine .. PartialViewLocationFormats et l'a ajouté à la liste des ViewEngines .

ViewEngines.Engines.Add(new RazorViewEngine
{
    PartialViewLocationFormats = new string[]
    {
        "~/Views/{1}/Partials/{0}.cshtml",
        "~/Views/Shared/Partials/{0}.cshtml"
    }
});

17voto

Gabriel Militello Points 141

C'est bien de personnaliser le moteur d'affichage, mais si vous voulez juste avoir un sous-dossier pour les partiels, vous n'en avez pas besoin...

Il suffit d'utiliser le chemin d'accès complet à la vue partielle, comme pour la vue de mise en page :

@Html.Partial("/Views/Shared/Partial/myPartial.cshtml")

J'espère que cela aidera quelqu'un...

7voto

mcfea Points 87

J'ai mis à jour l'excellente réponse de Lamarant pour inclure Areas :

public class RDDBViewEngine : RazorViewEngine
{
    private static readonly string[] NewPartialViewFormats =
    {
        "~/Views/{1}/Partials/{0}.cshtml",
        "~/Views/Shared/Partials/{0}.cshtml"
    };

    private static List<string> AreaRegistrations;

    public RDDBViewEngine()
    {
        AreaRegistrations = new List<string>();

        BuildAreaRegistrations();

        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(areaRegistrations).ToArray();
    }

    private static void BuildAreaRegistrations()
    {
        string[] areaNames = RouteTable.Routes.OfType<Route>()
            .Where(d => d.DataTokens != null && d.DataTokens.ContainsKey("area"))
            .Select(r => r.DataTokens["area"].ToString()).ToArray();

        foreach (string areaName in areaNames)
        {
            AreaRegistrations.Add("~/Areas/" + areaName + "/Views/Shared/Partials/{0}.cshtml");
            AreaRegistrations.Add("~/Areas/" + areaName + "/Views/{1}/Partials/{0}.cshtml");
        }
    }
}

N'oubliez pas d'inclure le début de votre candidature :

public class MvcApplication : System.Web.HttpApplication
{

    protected void Application_Start()
    {
        ...

        ViewEngines.Engines.Add(new RDDBViewEngine()); 
    }
}

5voto

SridharVenkat Points 288

Vous pouvez également mettre à jour les partialview-location-formats du RazorViewEngine enregistré. Placez le code ci-dessous dans Application_Start dans Global.asax.

 RazorViewEngine razorEngine = ViewEngines.Engines.OfType<RazorViewEngine>().FirstOrDefault();
        if (razorEngine != null)
        {
            string[] newPartialViewFormats = new[] { 
                    "~/Views/{1}/Partials/{0}.cshtml",
                    "~/Views/Shared/Partials/{0}.cshtml"
            };
            razorEngine.PartialViewLocationFormats =
                razorEngine.PartialViewLocationFormats.Union(newPartialViewFormats).ToArray();
        }

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