如何设置System.Web.WebPages.WebPage.Model属性

时间:2011-05-27 15:19:17

标签: asp.net-routing asp.net-webpages

我计划通过动态创建WebPage个实例,使用ASP.NET网页创建自定义路由,如下所示:

IHttpHandler handler = System.Web.WebPages.WebPageHttpHandler.CreateFromVirtualPath("~/Default.cshtml");

如何将对象提供给底层WebPage对象,以便它可以成为网页的“模型”?换句话说,我希望能够在文件@Model.Firstname中编写Default.cshtml

任何帮助将不胜感激。

更新

通过@Pranav修改答案,我能够使用反射检索基础WebPage对象:

    public void ProcessRequest(HttpContext context)
    {
        //var page = (WebPage) System.Web.WebPages.WebPageHttpHandler.CreateFromVirtualPath(this.virtualPath);

        var handler = System.Web.WebPages.WebPageHttpHandler.CreateFromVirtualPath(this.virtualPath);
        var field = handler.GetType().GetField("_webPage", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        var page = field.GetValue(handler) as System.Web.WebPages.WebPage;

        var contextWrapper = new HttpContextWrapper(context);
        var pageContext = new WebPageContext(contextWrapper, page, context.Items[CURRENT_NODE]);

        page.ExecutePageHierarchy(pageContext, contextWrapper.Response.Output);
    }

不幸的是,这不可靠,因为它在Medium Trust中不起作用(如果应用程序未以完全信任的方式运行,则会忽略BindingFlags.NonPublic)。因此,虽然我们取得了重大进展,但解决方案尚未完成。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:2)

WebPage的Model属性来自WebPageContext。要设置模型,可以使用正确的参数创建WebPageContext: -

var page = (WebPage)WebPageHttpHandler.CreateFromVirtualPath("~/Default.cshtml");
var httpContext = new HttpContextWrapper(HttContext.Current);
var model = new { FirstName = "Foo", LastName = "Bar" };
var pageContext = new WebPageContext(httpContext, page, model);

page.ExecutePageHierarchy(pageContext, httpContext.Response.Output);

模型实例现在应该可以在页面中以动态类型的形式提供给您。