首页 文章

是否可以将ASP.NET修改为不再需要runat =“server”?

提问于
浏览
2

我知道为什么runat = "server"目前是必需的(ASP.NET why runat="server"),但大家一致认为,如果你在设计中加入一个简单的默认值(我当然同意),就不应该要求它 .

是否可以修改,扩展,反编译和重新创建,拦截或以其他方式更改ASP.NET解析ASPX和ASCX文件的行为,以便不再需要runat =“server”?例如,我假设Mono的一个版本可以分支来实现这个目标 .

如果特定要求有用,以下重点介绍一种设计:

  • 在解析期间,遇到配置的命名空间标记(例如"asp")时,将元素的runat属性默认为"server"

  • 在解析期间,遇到配置的命名空间标记(例如"asp")时,如果元素的runat属性值可用,则应使用该值代替默认值

  • 引入了新的页面级设置(可以在page指令或web.config中设置),它指定特定命名空间标记的默认runat值

2 回答

  • 0

    我担心你必须修改整个页面解析器来完成这个,我认为这不可能 .

    另一方面,您应该能够创建自己的 . 请参阅buildProviders ElementBuildProvider class . 您应该能够为.aspx页面创建自己的构建提供程序,并使用它来替换内置提供程序 .

    不幸的是,ASP.NET使用的 PageBuildProvider 类是内部的,它用于解析页面的 PageParser 类是 sealed . 你完全靠自己 .

    考虑到 runat="server" 已经在ASP.NET中存在了十年,我认为你很快就会改变 .

    你也会失去设计师支持,但也许你不关心它 .

  • 0

    据我所知,在ASP.NET页面处理过程中没有足够的钩子允许这样做 . 我知道无法覆盖或扩展实际的aspx / ascx代码的解析或处理 .

    虽然ASP.NET相当灵活,并允许您覆盖许多默认行为(如ViewState的保存/加载方式,存储Session的位置等),但这不是其中之一 .

    但是......从技术上讲,Page对象只是另一个HttpHandler . 您可以编写处理程序并使用它执行任何操作 . 您所要做的就是实现Page类所做的一切,然后抛出这个额外的功能 . :)或者,拉出Reflector并挖掘Page对象的ProcessRequest方法,看看它实际解析/初始化aspx中声明的对象的位置,你可能会得到如何实现你正在寻找的功能的线索 . 但我怀疑你是在浪费你的时间 .

相关问题