由于某种原因,我正在搞乱“简约”的ASP.Net只是为了好玩。我已经禁用了很多东西,并试图重新实现。我无法弄清楚的一件事是如何呈现ASP.Net页面(aspx)。
这是我目前的进展:
//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();
}
/ static / bit和“hi world”一样工作。我不能让/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>
它几乎没有代码(只是一个无关紧要的空函数)
我在这里做错了什么?
答案 0 :(得分: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);
}
答案 1 :(得分:4)
您可以在此处使用HttpContext.Current.Server.Execute
。请参阅HttpServerUtility.Execute。
答案 2 :(得分:1)
我的第一个想法是你不要打电话给隐藏的Page.FrameworkInitialize。在这种情况下,我不确定它是否真的为你做了什么。
我也相信Page.ProcessRequest将直接呈现给提供的HttpContext。在Render调用this.RenderControl(this.CreateHtmlTextWriter(this.Response.Output))
期间,请参阅Reflector中的ProcessRequestMain。
我们无法看到您从哪里获得Request和Response对象。您是否已将sender
参数发送给您的HttpApplication进行了检查,因此您确定使用的是正确的对象?
答案 3 :(得分:1)
本文展示how to render a UserControl from a web service。可能是有帮助的。