Механизм представления asp.net по умолчанию связан с механизмом asp.net.Это связано с контекстом, я думаю, что вы можете обойти это, но это определенно не просто .
Проблема заключается в комбинации движка представления по умолчанию + движка asp.net, другие движки представления не должнынет этой проблемы.По крайней мере, движок Spark View не делает этого.
Редактировать: Операционная система решена с последними подсказками, но пока моя версия, которая использует действие home index контроллера по умолчаниюasp.net шаблон проекта MVC:
public class MyAppHost : MarshalByRefObject
{
public string RenderHomeIndexAction()
{
var controller = new HomeController();
using (var writer = new StringWriter())
{
var httpContext = new HttpContext(new HttpRequest("", "http://example.com", ""), new HttpResponse(writer));
if (HttpContext.Current != null) throw new NotSupportedException("httpcontext was already set");
HttpContext.Current = httpContext;
var controllerName = controller.GetType().Name;
var routeData = new RouteData();
routeData.Values.Add("controller", controllerName.Remove(controllerName.LastIndexOf("Controller")));
routeData.Values.Add("action", "index");
var controllerContext = new ControllerContext(new HttpContextWrapper(httpContext), routeData, controller);
var res = controller.Index();
res.ExecuteResult(controllerContext);
HttpContext.Current = null;
return writer.ToString();
}
}
}
... из отдельного проекта:
[TestMethod]
public void TestIndexAction()
{
var myAppHost = (MyAppHost)ApplicationHost.CreateApplicationHost(
typeof(MyAppHost), "/", @"c:\full\physical\path\to\the\mvc\project");
var view = myAppHost.RenderHomeIndexAction();
Assert.IsTrue(view.Contains("learn more about"));
}
Некоторые дополнительные примечания:
- url в новом HttpRequestне имеет значения, но должен быть действительным URL-адресом
- , он не предназначен для использования из приложения asp.net, в котором уже есть контекст, в котором говорится, что я не уверен, чтофактически порождает новый AppDomain и работает
- Конструктор типа контроллера и конкретный экземпляр явно в коде, может быть заменен чем-то, что должно быть передано в параметрах, но необходимо иметь дело с ограничениями MarshalByRef / наихудшего случая, некоторыедля этого можно использовать простое отражение