我有一些生成模型和控制器类的代码:
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");
}
生成的控制器代码如下所示:
//------------------------------------------------------------------------------
// <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>
{
}
}
如何将编译后的控制器注册到 mvc 框架中,这样调用 /Question 就不会以“找不到资源”结束
我认为问题不在于路由表。
return RedirectToAction("Index", t.Name);
也不行。我认为为此不需要路线注册。我拥有的路线注册非常通用和标准。
routes.MapRoute(
"Default", // Routenname
"{controller}/{action}/{id}", // URL mit Parametern
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameterstandardwerte
);
我记得 MVC 要求 Controller 位于某个目录中 - 在这种情况下它不是。但这真的是一个很奇怪的约定吗?我的意思是 MVC 对目录信息做了什么?我相信它确实会在启动时扫描它并以某种方式注册控制器。那我为什么以后不注册呢?只有 - 怎么?!?
我也不认为问题出在程序集上。
我有这个代码:
// Invoke compilation.
CompilerResults cr = provider.CompileAssemblyFromDom(cp, cu);
Type t = cr.CompiledAssembly.GetExportedTypes().First();
return t;
t 返回编译后的类型。所以我假设它在编译后已经加载。否则 t 将不为人知。我还可以在输出窗口中看到它已加载。