Frage

Ich habe einen Code, der ein Modell und eine Controller -Klasse generiert:

public ActionResult Generate()
{

    ModelGenerator model = new ModelGenerator("c:/Upload/SampleModel.cs", "CodeDOMSample");
    model.addProperties();
    model.addConstructor();
    model.GenerateCSharpCode(model._outputFileName);
    Type t = Generator.CompileDOM(model.targetUnit, "c:/Upload/ModelCode.dll", model.assemblies());

    ControllerGenerator controller = new ControllerGenerator("c:/Upload/SampleController.cs", "CodeDOMSample",t);
    controller.GenerateCSharpCode(controller._outputFileName);
    Generator.CompileDOM(controller.targetUnit, "c:/Upload/ControllerCode.dll", controller.assemblies());

    // Somehow register compiled Controller to MVC

    return RedirectToAction("About");
}

Der generierte Controller -Code sieht folgendermaßen aus:

//------------------------------------------------------------------------------
// <auto-generated>
//     Dieser Code wurde von einem Tool generiert.
//     Laufzeitversion:4.0.30319.1
//
//     Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
//     der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------

namespace CodeDOMSample
{
    using System;
    using System.Web;
    using System.Web.MVC;


    // Copyright (c) AdaPro GmbH. All rights reserved.
    public sealed class QuestionController : PlatformController<CodeDOMSample.Question>
    {
    }
}

Wie kann ich den kompilierten Controller im MVC -Framework registrieren, damit das Anruf /die Frage nicht mit "Ressource nicht gefunden werden kann" endet.

Ich denke nicht, dass das Problem der Routentisch ist.

return RedirectToAction("Index", t.Name);

Funktioniert auch nicht. Ich denke, dafür ist keine Routenregistrierung erforderlich. Die Routenregistrierung, die ich habe, ist ziemlich allgemein und Standard.

    routes.MapRoute(
        "Default", // Routenname
        "{controller}/{action}/{id}", // URL mit Parametern
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameterstandardwerte
    );

Ich erinnere mich, dass MVC den Controller in einem bestimmten Verzeichnis befindet - was in diesem Fall nicht der Fall ist. Aber ist das wirklich so seltsam. Ich meine, was macht MVC mit den Verzeichnisinformationen? Es scannt es und registriert den Controller bei Startup irgendwie, glaube ich. Warum sollte ich mich später nicht später registrieren? Nur - wie?!?

Ich glaube auch nicht, dass das Problem die Montage ist.

Ich habe diesen Code:

// Invoke compilation. 
CompilerResults cr = provider.CompileAssemblyFromDom(cp, cu); 
Type t = cr.CompiledAssembly.GetExportedTypes().First(); 
return t; 

t gibt den kompilierten Typ zurück. Ich gehe also davon aus, dass es nach Zusammenstellung bereits geladen ist. Ansonsten wäre T nicht bekannt. Ich kann auch im Ausgangsfenster sehen, dass es geladen ist.

War es hilfreich?

Lösung

Einige Vorschläge:-

1) Versuchen Sie eine benutzerdefinierte Controller -Fabrik (siehe zB. http://nayyeri.net/custom-controller-factory-in-asp-net-mvc) oder vielleicht Ihre eigene Irloutehandler -Implementierung. MVC 2 hat viele Erweiterbarkeitspunkte, an die Sie sich anschließen können.

2) Schauen Sie sich die MVC 2 Quellen an. Das TypeControllerCache Findet Controller, die Reflexion über das verwenden geladen Versammlungen. Das ist wahrscheinlich der Grund, warum es Ihren Typ nicht findet.

Andere Tipps

Sie müssten wahrscheinlich Ihre neue Montage in die Appdomain laden.

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