ASP.NET WebForm 纯代码呈现页面, 不带aspx或ashx

作者:V君 发布于:2015-3-2 22:54 Monday 分类:折腾手记

这些天继续折腾相对MVC老掉牙的WebForm,做个自己的数据管理前端.

泥萌就用连表单验证都要自己加脚本的MVC吧,还是觉得高度集成的WebForm好使.

目前几乎没用到ASPX文件了, 全靠代码创建表单控件树. 

谁说我大ASP.NET只是拖拖控件而已的! 

由于已经把基础页面类封装得近乎完整(当然还不完美).每添加一个数据库表管理页面只需要继承一下页面基类就能完整实现列表查询/输入表单以及回传事件处理.


那么问题来了: 能不能把ASPX扔掉? 因为现在它只充当个一般处理程序一样的存在,但是一般处理程序似乎不能处理控件树.


答案是可以!


这回听故事吧.  首先, 理所当然是去咕狗然后爆栈,  找到一些类似URL重写啦,  web.config映射啦, 有的直接上MVC... 然后, 看到了这个帖子, 嗯 比较靠谱的样子.


直接尝试创建现有页面的实例交给HttpApplication.Handler,

运行, 啪 空引用错误...(一会再告诉你这是在犯傻)


猜测是缺少aspx文件生成的代码, 虽然早就知道ASPX最后会还是会生成个类, 来继承你的页面后台代码, 于是扒出生成的代码慢慢啃, 嗯, 空指针是因为没加 IRequiresSessionState, 操作Session时挂掉了, 你说蠢不蠢 -_-\\

 

放进项目里 -> 去除各种预编译 -> 查看调用顺序 


发现了这玩意: System.Web.UI.Page 的 protected override void FrameworkInitialize()

学过ASP.NET的都应该知道生命周期最先的是PreInit, 然而这是啥呢, 后面讲~


不管这么多 新建个类继承一下 System.Web.UI.Page 首先啥也不写直接交给 Application,

OK 白屏 没报错! 然后网表单上添加个控件之后报错了, 回去继续爬, 发现 @__BuildControlTreel 里面 AddParsedSubObject 嗯 把 Form 和 Header 加进去了

实际上用 Page.Controls.Add 放进去也是可行的, 如果放入两个 Form 会引发错误, 以证明这样也行, 比起用 AddParsedSubObject 这个不熟悉的方法, 更倾向于用 Controls.Add .


嗯 看看生成什么样的HTML呢?--你会发现只有head和form这些标签,html和body哪去了?

继续回去看aspx生成的代码--这些都被当成静态文本装到 LiteralControl 塞到页面上了

于是咱们可以这么玩:

public class BasePureCodePageBasePageIRequiresSessionState 
{
    protected HtmlGenericControl Document { getprivate set; }
 
    protected HtmlGenericControl Body { getprivate set; }
 
    protected override void FrameworkInitialize()
    {
        base.FrameworkInitialize();
        Document = Controls.AddEx(new HtmlGenericControl("html"));
        Document.Controls.AddEx(new HtmlHead());
        Body = Document.Controls.AddEx(new HtmlGenericControl("body"));
        Body.Controls.AddEx(new HtmlForm());

    }

}

自己加不就好了! 还可以随意调整哩! AddEx是扩展方法, 在原来的基础上返回已添加的控件.


先到这儿, 有新发现再更~

 

 

 

标签: 软件开发 C# ASP.NET WebForm

引用地址:

发表评论:

Powered by emlog 去你妹的备案 sitemap