我计划通过动态创建WebPage
实例,使用ASP.NET网页创建一个自定义路由,如下所示:
IHttpHandler handler = System.Web.WebPages.WebPageHttpHandler.CreateFromVirtualPath("~/Default.cshtml");
如何向底层WebPage
对象提供对象,使其成为网页的"模型"?换句话说,我希望能够在文件Default.cshtml
中写入@Model.Firstname
。
任何帮助都将不胜感激。
更新
通过@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);
}
不幸的是,这是不可靠的,因为它在中等信任下不起作用(如果应用程序不是在完全信任下运行,则会忽略BindingFlags.NonPublic)。因此,尽管我们已经取得了重大进展,但解决方案尚未完成。
如有任何建议,我们将不胜感激。
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);
模型实例现在应该可以作为动态类型在页面中提供。