我有一个.aspx文件,想要添加一些HTML。问题是它无法修改。如果我升级产品,这个.aspx文件将被覆盖,我的修改将不得不再次完成。
这是一个开源产品,所以我可以看看代码隐藏。同样,我无法修改它,因为这会破坏我的升级路径。此外,我需要添加永远不会包含在产品中的功能,因此发送补丁是没用的。
所引用的类是一个部分类,所以我尝试通过在同一名称空间中创建另一个同名的部分类来实现额外的Page_PreRender。但是,由于这是在另一个程序集中,.net表示它不知道哪个是正确的类。
我有什么方法可以做到这一点吗?
答案 0 :(得分:2)
所以你既不能触摸这个页面的.aspx,也不能触及包含其代码的程序集?听起来你需要创建一个PageAdapter。
说你得到这个页面......
<%@ Page AutoEventWireup="true" ContentType="text/plain" Inherits="WebForm1" %>
SomeControl: <asp:Literal runat="server" ID="SomeControl" />
...后面有这个代码(在一个你只能引用但不能修改的程序集中)。
public class WebForm1 : Page {
protected void Page_Load(object sender, EventArgs e) {
var SomeControl = (Literal) FindControl("SomeControl");
SomeControl.Text = "Value set from code-behind.";
}
}
你可以做的是创建PageAdapter
之类的(在你自己的程序集中):
public class WebForm1Adapter : PageAdapter {
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
var SomeControl = (Literal) Page.FindControl("SomeControl");
SomeControl.Text = "Value set from control adapter.";
}
}
最后,您需要通过创建browser definition file:
来注册您的覆盖<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="WebForm1" adapterType="WebForm1Adapter" />
</controlAdapters>
</browser>
</browsers>
查看PageAdapter
和ControlAdapter
文档,找出覆盖正常网页行为的所有方法。
这应该会让第三方页面的更新变得更加痛苦。无论你做什么,合并更新本身都很脆弱。也就是说,除非第三方页面的作者有意识地呈现某种形式的稳定API。
答案 1 :(得分:0)
您可以使用Reflection Emit将代码注入到app启动时的类后面的代码中。