![]() |
1
6
我得回想一下UserControlDesigner代码… 短篇小说:我认为这是不可能的。 长话短说: 据我所知,位于ascx文件中的用户控件永远不会在设计器中运行。也就是说,在Visual Studio中,不会编译或运行ascx或ascx.cs文件中的代码。这是为了防止由于无法在CLR中卸载已加载的程序集而导致的内存泄漏。为了在用户控件中运行代码,Visual Studio必须将ascx编译成一个dll,然后加载它,然后运行代码。每次更改ascx时,它都必须再次执行此操作。每次执行此操作时,从您的ascx生成的额外加载的dll将消耗更多的内存。 由于clr中的这种限制,用户控件设计器实际上不编译或运行ascx文件。相反,它解析ascx文件并在其中查找控件,并加载这些控件。对于在ascx文件中找到的每个控件,它将创建关联的控件设计器并呈现该控件的设计时HTML。 有几种方法可以解决这个问题:
这两个解决方案应该工作的原因是它们都涉及将代码编译成一个DLL。其想法是,DLL不会经常更改,因此Visual Studio可以安全地加载DLL,而无需在每次DLL更改(以及内存泄漏)时都重新加载它。 |
![]() |
2
1
我想我一定有答案,把它写了出来,但有什么事情困扰着我,所以我测试了几个小时。 结果(就像艾伦说的那样),我觉得你做不到。 ascx控件完全忽略 DesignerAttribute ,因此不能为它们指定自定义的设计时渲染器。我想“好吧,我可以对面板控件进行子类化,并在其上指定一个新的设计器,该设计器将从父控件获取属性”。你猜怎么着?没有机会。如果在设计器中访问面板的父控件, 它不会强制转换为自定义用户控件类型 .我可以看到它是一个用户控件,它不可能是除我的testUserControl之外的任何其他用户控件,但是如果我尝试强制转换它,设计器类会抛出一个异常! 老实说,这让我心烦意乱。这基本上就是Eilon所说的——在设计模式下对Web用户控件有一个有意的限制。 虽然这对我来说是一个有趣的学习机会,但我很抱歉地报告说,我不认为.ascx会切断它。我敢肯定,即使像艾伦建议的那样把它编译成一个dll,也做不到。您可能需要走自定义控制路线。 |
![]() |
Haim Ohayon · 这些链接之间有什么区别? 3 年前 |