是否有可能以编程方式确定ASP.NET MVC的Razor View模型?

时间:2012-07-11 06:43:26

标签: c# .net asp.net-mvc razor

我正在手动创建RazorView实例并手动将该视图呈现给我的响应输出。

var errorController = new FakeErrorController();
var controllerContext =
    new ControllerContext(httpApplication.Context.Request.RequestContext,
                          errorController);
var view = new RazorView(controllerContext, viewPath, null, false, null);
var viewModel = new ErrorViewModel
                {
                    Exception = currentError
                };
var tempData = new TempDataDictionary();
var viewContext = new ViewContext(controllerContext, view,
                                    new ViewDataDictionary(viewModel), tempData,
                                    httpApplication.Response.Output);
view.Render(viewContext, httpApplication.Response.Output);

工作正常。

但请注意我是如何对ViewModel进行硬编码的?我想知道是否可以查看RazorView是否定义了强类型ViewModel

例如。 @model SomeNamespace.Model.Foo

然后根据它创建一个新类型。让我们假设有一个无参数的默认构造函数。

这可能吗?

2 个答案:

答案 0 :(得分:1)

您可以使用以下代码获取视图的类型:

((ViewResult)otherController.Index()).Model.GetType()

这里的要点是我们必须将ActionResult强制转换为ViewResult。但是,如果你有返回从ActionResult继承的其他类型的动作(如HttpResult等),那将是不够的。

拥有该类型,您可以使用反射来实现它。

但是,我们只能在方法调用之后获取类型,我相信这不是你的情况。

希望它会有所帮助。

问候。

答案 1 :(得分:1)

该方法的泛化是否可以解决问题?

诸如......之类的东西。

public void MyMethod<T>(...)
    where T : class, new()
{
   // Your code
   var model = Activator.CreateInstance<T>();
   // More code
}