Sehr nah, aber nicht in der Lage, die Kernansicht nopcommerce @ zu überschreib

Ich habe einige sehr gute Beiträge von @ geles Wooncherk, Twisted Whisperer, undAlex Wolf. Ihre Artikel bzw. (Wooncherk), (Twisted Whisperer), und (Alex Wolf) waren extrem informativ, aber leider bin ich nicht so schlau wie der Rest der SO-Community und kann nicht ganz zusammenfügen, was mir fehlt.

Ich überschreibe eine Kernansicht im Admin-Bereich ... speziell die Bestellbearbeitungsansicht. Das Verhalten, das ich sehe, ist, dass es @ tNICH traf den Controller in meinem Plugin, aber es TUT Meine benutzerdefinierte Ansicht anzeigen. Das Problem ist, dass sich die benutzerdefinierte Ansicht im Admin-Projekt befindet und mich das wirklich verwirrt. Wie kann ich ein in sich geschlossenes Plugin haben, das noch meine benutzerdefinierte Ansicht im zentralen Admin-Bereich installieren muss?

Ich dachte, vielleicht zu Unrecht, dass mein Controller zuerst getroffen wird, wenn nach Pfaden gesucht wird, weil ich eine höhere Priorität festgelegt habe.

So ist das Befolgen der Anweisungen hier mein Code.

CustomViewEngine:

private readonly string[] _emptyLocations = null;

    public CustomViewEngine()
    {
        PartialViewLocationFormats = new[]
        {
            "~/Administration/MyExtension/Views/{1}/{0}.cshtml",
            "~/Administration/MyExtension/Views/Shared/{0}.cshtml"
        };

        ViewLocationFormats = new[]
        {
            "~/Administration/MyExtension/Views/{1}/{0}.cshtml",
            "~/Administration/MyExtension/Views/Shared/{0}.cshtml"
        };
    }


    protected override string GetPath(ControllerContext controllerContext, string[] locations, string[] areaLocations, string locationsPropertyName, string name, string controllerName, string theme, string cacheKeyPrefix, bool useCache, out string[] searchedLocations) 
    {
        searchedLocations = _emptyLocations;
        if (string.IsNullOrEmpty(name)) 
        {
            return string.Empty;
        }

        string areaName = GetAreaName(controllerContext.RouteData);

        //little hack to get nop's admin area to be in /Administration/ instead of /Nop/Admin/ or Areas/Admin/
        if (!string.IsNullOrEmpty(areaName) && areaName.Equals("admin", StringComparison.InvariantCultureIgnoreCase)) 
        {
            var newLocations = areaLocations.ToList();
            newLocations.Insert(0, "~/Administration/Views/{1}/{0}.cshtml");
            newLocations.Insert(0, "~/Administration/Views/Shared/{0}.cshtml");

            //Insert your custom View locations to the top of the list to be given a higher precedence
            newLocations.Insert(0, "~/Administration/MyExtension/Views/{1}/{0}.cshtml");
            newLocations.Insert(0, "~/Administration/MyExtension/Views/Shared/{0}.cshtml");

            areaLocations = newLocations.ToArray();
        }

        bool flag = !string.IsNullOrEmpty(areaName);
        List<ViewLocation> viewLocations = GetViewLocations(locations, flag ? areaLocations : null);

        if (viewLocations.Count == 0) 
        {
            throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, "Properties cannot be null or empty.", new object[] { locationsPropertyName }));
        }

        bool flag2 = IsSpecificPath(name);
        string key = CreateCacheKey(cacheKeyPrefix, name, flag2 ? string.Empty : controllerName, areaName, theme);

        if (useCache) 
        {
            var cached = ViewLocationCache.GetViewLocation(controllerContext.HttpContext, key);
            if (cached != null) 
            {
                return cached;
            }
        }

        if (!flag2) 
        {
            return GetPathFromGeneralName(controllerContext, viewLocations, name, controllerName, areaName, theme, key, ref searchedLocations);
        }

    return GetPathFromSpecificName(controllerContext, name, key, ref searchedLocations);
}

Route Provider Siehe Kommentare Versuche die Core-URL ~ / Admin / Order / Edit / 1 @ zu überschreib

public void RegisterRoutes(RouteCollection routes)
    {
        ViewEngines.Engines.Insert(0, new CustomViewEngine());

//the articles above did NOT mention adding a path but it seemed like I needed to in order for my override path to be included???
        routes.MapRoute("Plugin...OrderDetailsOverride", "Order/Edit/{id}",
             new { controller = "MyOrder", action = "Edit" },
             new { id = @"\d+" },
             new[] { "MyPlugin.Controllers" }
        );            

    }

    public int Priority
    {
        get
        {
            return 1;
        }
    }

Ich habe eine 404-Fehlermeldung erhalten und Twisted Whisperer erneut sorgfältig gelesen. Er (ich nehme an, er) gibt an:

Wenn Sie beispielsweise Nop.Admin / Views / Category / Tree.cshtml überschreiben, platzieren Sie Ihre benutzerdefinierte Tree.cshtml in Nop.Admin / CustomExtension / Views / Category / Tree.cshtml

Nun wenn ich das wörtlich interpretiere würde ich das im @ machCORE ADMIN project:

Ich habe das offensichtlich getan und es hat funktioniert ... irgendwie.

So zusammenfassend sind meine Fragen / Probleme:

Mein Order Override Controller im Plugin ist nicht getroffen ... (nicht daran interessiert, ActionFilters zu verwenden, da sie mir nicht das geben, was ich brauche ... ich glaube nicht).

Die Ansicht in meinem Plugin ist nicht getroffen, aber die Ansicht, die zum Administrationsprojekt hinzugefügt wurde, ist getroffen?

Etwas zu 2. Wenn zwei richtig sind, wie ist das dann eine praktikable Plugin-Lösung? Für einen Produktionsschub, Updates usw. müsste ich möglicherweise die NopCommerce-Kernprojekte berühren ... na, warum sollte ich mich dann um ein Plugin kümmern?

Nun, die NOP-Leute und die SO-Community sind viel klüger als ich, also bin ich mir sicher, dass ich es einfach nicht richtig verstehe.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage