gpt4 book ai didi

asp.net - 如何为 ASP.NET AJAX UpdatePanel 请求覆盖 ​​HtmlTextWriter?

转载 作者:行者123 更新时间:2023-12-04 05:12:29 25 4
gpt4 key购买 nike

我继承了 System.Web.UI.HtmlTextWriter 在 ASP.NET 应用程序中对 HTML 进行一些自定义呈现。这是在我的 Web.config 文件中使用以下内容进行配置的:

<browserCaps>
tagwriter="MyAssembly.CustomHtmlTextWriter, MyAssembly"
</browserCaps>

这适用于常规页面请求,调用 OnTagRender 等重写方法并将自定义 HTML 发送到浏览器。

但是,在使用 UpdatePanel 执行异步回发时,永远不会调用此代码,并且 HTML 到达浏览器时无需我进行自定义修改。我是否缺少一些可以为 AJAX 请求加载自定义 HtmlTextWriter 的配置?

最佳答案

首先,我可以向您保证,您的自定义 HTMLTextWriter 被正确调用,并且您在配置方面没有做错任何事情。

使用您的 web.config 部分,我编写了一个测试应用程序,并在 var cap = ... 上包含以下断点线:

    protected void UpdatePanel1_Load(object sender, EventArgs e)
{
var cap = Request.Browser.TagWriter;
}

在初始 HTTP GET 和 AJAX 回发中,断点被命中,我可以看到正在使用的 TagWriter 实际上是 CustomHtmlTextWriter。此外,我可以在 CustomHtmlTextWriter 构造函数上设置断点,并且在回发时命中该断点。

我还确认,即使您在回发时添加全新的控件,即使调用了 CustomHtmlTextWriter 构造函数,OnTagRender、OnAttributeRender 和其他事件也不会触发。

此外,不会调用 RenderBefore...() 和 RenderAfter...() 方法。

所以这回答了你的问题“我的配置有没有做错?”:不,你没有。您的自定义 HtmlTextWriter 已实例化和引用,但没有调用任何有用的方法(调用了 BeginRender,但没有调用通常用于更改标签的方法)。

此时,值得注意的是 browserCaps 标记在 .NET 2.0 中已弃用,因此您的用例似乎不受支持也就不足为奇了。我认为 ControlAdapter 架构应该可以完成工作,具体取决于您想要做什么。

例如,假设我想用仅包含其 ID 的跨度替换所有文本框和标签,并在初始 GET 和 AJAX 回发上进行这项工作。当然你的例子会更复杂,但希望这种简化会给你这个想法。

我需要做的就是创建一个可以作用于任何 Web 控件的 ControlAdapter:
public class CustomControlAdapter : WebControlAdapter
{
protected override void RenderBeginTag(HtmlTextWriter writer)
{
writer.WriteLine();
writer.WriteBeginTag("span");
writer.Write(HtmlTextWriter.TagRightChar);
}

protected override void RenderEndTag(HtmlTextWriter writer)
{
writer.WriteEndTag("/span");
writer.WriteLine();
}

protected override void RenderContents(HtmlTextWriter writer)
{
writer.WriteLine(Control.ID);
}
}

然后,我将它连接到我对它感兴趣的控件类型。为此,我在 App_Browsers 文件夹中创建了一个 Adapters.browser 文件,并包含以下配置:
<browsers>
<browser refID="Default">
<controlAdapters>
<adapter
controlType="System.Web.UI.WebControls.Label"
adapterType="WebApplication1.CustomControlAdapter"
/>
<adapter
controlType="System.Web.UI.WebControls.TextBox"
adapterType="WebApplication1.CustomControlAdapter"
/>
</controlAdapters>
</browser>
</browsers>

请注意,我的“默认”浏览器 refID 将适用于所有浏览器。现在,当需要呈现 Label 或 TextBox Web 控件时,CustomControlAdapter 会处理它。上面的代码在我的示例应用程序中进行了测试,即使使用 AJAX 也能完美运行。在您的情况下,我猜您只需要向上面的 Adapters.browser 文件添加更多控件类型,您就应该 100% 从事业务。

关于asp.net - 如何为 ASP.NET AJAX UpdatePanel 请求覆盖 ​​HtmlTextWriter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14726625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com