Frage

Ich versuche, eine benutzerdefinierte Ansicht Motor impliment Mobil Blick auf den User-Agent-Basis zu dienen. Ich verfolge Scott Hanselman Ansatz von diesem Blog-Eintrag .

Ich habe von der WebFormsViewEngine geerbt und der FindView Methode die gleiche Art und Weise außer Kraft gesetzt, die Scott in seinem Blog beschreibt.

Ich habe dann ein paar Zeilen zu meinen Global.asax Application_Start Verfahren der Ansicht Motor Sammlung zu löschen und eine neue Instanz meiner Ansicht Motor hinzufügen.

Nach einigen Tests scheint es, dass MVC meine Ansicht-Engine ignoriert. Wenn es scheiterte an meine benutzerdefinierte Ansichten basierend auf dem User-Agent des Browsers finden griff ich den benutzerdefinierten Pfad hartzucodieren zur Ansicht anzuhängen und es noch geschafft, wieder auf die Standardansicht fallen. Ich einen Haltepunkt setzte in meiner FindView Methode und sicher genug, es ist gar nicht aufgerufen wird.

Wie kann ich meine benutzerdefinierte Ansicht Motor zu arbeiten? Jede Hilfe wird sehr geschätzt.

Meine Ansicht-Engine sieht wie folgt aus:

public class MyViewEngine: WebFormsViewEngine
{
    public override ViewEngineResult FindView (ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
         ViewEngineResult result = null;

         //Serve a special view for iPhones
         if (UserAgentIs(controllerContext, "iPhone"))
         {
              result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache);
         }

         //If no special view is found, fall back to the default view
         if (result == null || result.View == null)
         {
              result = base.FindView(controllerContext, viewName, masterName, useCache);
         }

         return result;
    }

    private bool UserAgentIs(ControllerContext controllerContext, string userAgentToTest)
    {
         return (controllerContext.HttpContext.Request.UserAgent.IndexOf(userAgentToTest, StringComparison.OrdinalIgnoreCase) > 0);
    }
}

Und in meinem Global.asax:

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new MyViewEngine());
}

Wenn diese Einstellung nicht funktioniert Ich habe sogar versucht, meine FindView Methode, dies zu vereinfachen:

public override ViewEngineResult FindView (ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
         ViewEngineResult result = null;
         result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache);
         return result;
    }

Und das hat nicht funktioniert. Er kehrte nach wie vor die Standardansicht. Und ja, die Ansichtsseite und Master-Seite, die von dieser Aussage existieren tatsächlich gefunden werden sollte. Ich bin ziemlich, warum stapfte dies nicht funktioniert.

War es hilfreich?

Lösung

Gut, das ist sicher peinlich:

Wenn ich meine Ansicht Motor schreibe ich wurde nach der Blog-Post von Scott Hanselman (meinen ursprünglichen Beitrag für den Link sehen). Ich delcared meine Ansicht nach Motorklasse entschied dann würde ich einfach kopieren und Scotts Code in meine Klasse einfügen und nach Bedarf ändern. Ich kopierte versehentlich seinen Code mit der Klassendefinition in meine Klasse eine verschachtelte Klasse erstellen. Daher meine Ansicht Motor würde eine Überschreibung für die FindView Verfahren enthalten und natürlich die man in der verschachtelten Klasse eigentlich nicht nie aufgerufen werden!

Die Lektion: bei der Verwendung von Code online kopiert nicht gefunden und einfügen! geben Sie es immer selbst.

Vielen Dank an alle, die diese Frage heraus überprüfen und versuchten, mir zu helfen.

Ich werde jetzt in der Ecke der Scham und Verlegenheit gehen stehen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top