2010-12-04 93 views
8

由于某种原因,我搞乱了“简约”ASP.Net只是为了好玩。我禁用了很多东西,并试图重新实现。我无法弄清楚的一件事是如何渲染一个ASP.Net页面(aspx)。如何从Global.asax呈现asp.net WebForm页面?

这是迄今为止我的进步:

//global.asax 
    protected virtual void Application_BeginRequest (Object sender, EventArgs e) 
    { 
     HtmlTextWriter writer=new HtmlTextWriter(Response.Output); 
     if(Request.Url.AbsolutePath.Substring(0,Math.Min(Request.Url.AbsolutePath.Length,8))=="/static/"){ 
      return; //let it just serve the static files 
     }else if(Request.Url.AbsolutePath=="/test1"){ 
      test1 o=new test1(); 
      o.ProcessRequest(Context); 
      o.RenderControl(writer); 
      writer.Flush(); 
      writer.Close(); 
      Response.Flush(); 
     // Response.Write(writer.ToString()); 

     }else{ 
      Response.ContentType="text/plain"; 
      Response.Write("Hi world!"); 
     } 
     CompleteRequest(); 
    } 

的/静态/ bit作为,那么 “喜世”。尽管如此,我无法获得/test1的路线。它达到了这一点,但所有显示的是黑色页面。

我有这个设计内容的test1.aspx页:

<%@ Page Language="C#" Inherits="namespace.test1" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
<head> 
    <title>test1</title> 
</head> 
<body> 
    <form id="form1"> <!--just testing if two forms works and such--> 

    </form> 
    <form id="form2"> 
    <input type="text" id="test1" /> 
    </form> 
</body> 
</html> 

,它几乎没有后面的代码(只是这不要紧,一个空函数)

我在做什么错这里?

回答

1

我的第一个想法是,你不要调用隐藏的Page.FrameworkInitialize。在这种情况下,我不确定它是否会为您做任何事情。

我也相信Page.ProcessRequest将直接呈现给提供的HttpContext。请参阅Reflector中的ProcessRequestMain,在渲染期间调用this.RenderControl(this.CreateHtmlTextWriter(this.Response.Output))

我们没有看到你从哪里得到你的请求和响应对象。您是否已将您发送给您的HttpApplication作为sender参数进行检查,因此您确定您使用的是正确的对象?

+0

是它们是正确的Request和Response对象,它们就像内置到在Global.asax类 – Earlz 2010-12-04 18:34:32

5

Global.asax是一个红色的鲱鱼。 ASP.NET是成功呈现您请求的页面:

test1 o=new test1(); 

test1是代码隐藏类的test1.aspx页。这不是你想要的,看看?您期望看到的所有内容都来自test1.aspx文件。你需要做的是告诉ASP.NET呈现test1.aspx到Response.Output:

using (var o = (Page) BuildManager.CreateInstanceFromVirtualPath("/test1.aspx", typeof (Page))) { 
    o.ProcessRequest(Context); 
}