捕获 ASP.NET UserControls 中未处理的异常

2023-11-27

我动态加载用户控件,将它们添加到 Web 表单的 Controls 集合中。

如果用户控件在渲染时导致未处理的异常,我想隐藏它们。

因此,我尝试挂钩每个 UserControl 的 Error 事件,但似乎 UserControl 永远不会像 Page 类那样触发该事件。

谷歌搜索了一下,似乎没有希望。这里有什么想法吗?


mmilic,继自你的回应 to my 先前的想法..

不需要额外的逻辑!这就是重点,您对相关类不执行任何操作,只是将它们包装在一些实例化气泡包装中! :)

好的,我本来只是要点,但我想亲眼看看这项工作,所以我拼凑了一些very代码很粗糙,但概念已经存在并且似乎有效。

为长篇文章道歉

安全加载器

这基本上就是我提到的“气泡”。它将获取控件 HTML,捕获渲染期间发生的任何错误。

public class SafeLoader
{
    public static string LoadControl(Control ctl)
    {
        // In terms of what we could do here, its down
        // to you, I will just return some basic HTML saying
        // I screwed up.
        try
        {
            // Get the Controls HTML (which may throw)
            // And store it in our own writer away from the
            // actual Live page.
            StringWriter writer = new StringWriter();
            HtmlTextWriter htmlWriter = new HtmlTextWriter(writer);
            ctl.RenderControl(htmlWriter);

            return writer.GetStringBuilder().ToString();
        }
        catch (Exception)
        {
            string ctlType = ctl.GetType().Name;
            return "<span style=\"color: red; font-weight:bold; font-size: smaller;\">" + 
                "Rob + Controls = FAIL (" + 
                ctlType + " rendering failed) Sad face :(</span>";
        }
    }
}

和一些控件..

好吧,我只是在这里模拟了两个控件,一个会抛出垃圾,另一个会渲染垃圾。说到这里,我才不管呢。这些将替换为您的自定义控件。

坏控制

public class BadControl : WebControl
{
    protected override void Render(HtmlTextWriter writer)
    {
        throw new ApplicationException("Rob can't program controls");
    }
}

良好的控制

public class GoodControl : WebControl
{
    protected override void Render(HtmlTextWriter writer)
    {
        writer.Write("<b>Holy crap this control works</b>");
    }
}

The Page

好的,让我们看看“测试”页面。这里我只是实例化控件,抓取它们的 html 并输出它,我将遵循对设计器支持等的想法。

页面代码隐藏

    protected void Page_Load(object sender, EventArgs e)
    {
        // Create some controls (BadControl will throw)
        string goodHtml = SafeLoader.LoadControl(new BadControl());
        Response.Write(goodHtml);

        string badHtml = SafeLoader.LoadControl(new GoodControl());
        Response.Write(badHtml);
    }

Thoughts

好吧,我知道你在想什么,“这些控件是以编程方式实例化的,那么设计师支持呢?我花了很多时间让这些控件对设计师来说很好,现在你却在扰乱我的魔力”。

好的,所以我还没有真正测试过这个(可能一分钟就能完成!)但这里的想法是重写页面的 CreateChildControls 方法,并获取表单上添加的每个控件的实例并通过 SafeLoader 运行它。如果代码通过,您可以将其正常添加到 Controls 集合中,如果没有,那么您可以创建错误的文字或其他内容,这取决于您,我的朋友。

最后..

再次,很抱歉这篇文章很长,但我想在这里获取代码,以便我们可以讨论这个:) 我希望这有助于展示我的想法:)

Update

通过在设计器中添加一个控件并用它覆盖 CreateChildControls 方法进行了测试,工作正常,可能需要一些清理以使事情看起来更好,但我将把它留给你;)

protected override void CreateChildControls()
{
    // Pass each control through the Loader to check
    // its not lame
    foreach (Control ctl in Controls)
    {
        string s = SafeLoader.LoadControl(ctl);
        // If its bad, smack it downnnn!
        if (s == string.Empty)
        {
            ctl.Visible = false; // Prevent Rendering
            string ctlType = ctl.GetType().Name;
            Response.Write("<b>Problem Occurred Rendering " + 
                ctlType + " '" + ctl.ID + "'.</b>");
        }
    }
}

Enjoy!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

捕获 ASP.NET UserControls 中未处理的异常 的相关文章

随机推荐

  • 伴生对象无法访问类上的私有变量

    来自 Scala REPL 的相当奇怪的行为 尽管以下编译没有问题 class CompanionObjectTest private val x 3 object CompanionObjectTest def testMethod y
  • 找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)

    签署第三方程序集并将其添加到 GAC 后 我收到以下错误 程序集绑定程序日志条目也显示这个错误 它说不匹配的程序集不确定如何错误 因为我删除了所有 obj 和 bin 折叠并批量构建了应用程序 重新导入了 dll Assembly mana
  • Socket.IO 客户端 .js 文件位于哪里?

    我正在尝试让 socket io 节点库 工作 我的服务器端 js 正在工作 并且它正在监听 socket io 网站简单说明 这很好 但是 我要导入什么 JS 文件 我进入了node modules目录 在那里我通过npm安装了soc
  • 有没有办法在node.js的对象文字中指定ES6生成器方法?

    我似乎无法创建一个生成器方法作为对象文字 这是我的工作源代码 function getRecords data for var i 0 i lt data length i yield data i var records getRecor
  • 在 Python 中将重复项保留在列表中

    我知道这可能是一个简单的答案 但我无法弄清楚 Python 中将重复项保留在列表中的最佳方法是什么 x 1 2 2 2 3 4 5 6 6 7 输出应该是 2 6 我找到了这个链接 在 python 中查找 并保留 子列表的重复项 但我对
  • Scala 类无法覆盖扩展 java.util.comparator 的 Java 接口中的比较方法

    我目前正在开发一个 jEdit 插件的端口 以在 Scala 中编写所有代码 然而 我在某个时候被迫实现我自己的比较器 我的简化代码如下 class compare extends MiscUtilities Compare def com
  • StringBuilder 与 XmlTextWriter

    我试图从提供 Xml 内容的自定义 HttpHandler 中获得尽可能多的性能 我想知道哪个性能更好 使用 XmlTextWriter 类或临时 StringBuilder 操作 例如 StringBuilder sb new Strin
  • 具有自定义项目的 UIMenuController 不适用于 UICollectionview

    当长按 UICollectionViewCell 时 我添加了自定义菜单控制器 self becomeFirstResponder UIMenuItem menuItem UIMenuItem alloc initWithTitle Cus
  • 根据类为 DOM 元素添加事件监听器

    我有一张桌子 其中每个tr and td只有课程 我在选择课程时遇到问题td具有我需要的类的元素 HTML table tr class data td class cell 1 td td class cell2 td tr tr cla
  • 如何将 OrderBy 表达式数组传递给方法?

    我正在尝试增强我的存储库 以便它负责订购 我已经应用了来自的答案这个问题就存储库而言 我很确定它已经完成了 我遇到的问题是我不确定现在如何将数组传递给存储库中的方法 编译器一直对我大喊关于委托的事 在上面的链接问题中 作者本质上是在做我想做
  • 如何在 r 中绘制 3D 函数? [复制]

    这个问题在这里已经有答案了 我有一个 3D 函数 比方说 De Jong 函数 fdejong lt function x y return x 2 y 2 我怎样才能以3D方式绘制它的情节 我想实现与维基百科类似的效果 尝试这个 fdej
  • 向 iOS 应用程序添加拖放组件

    如果这看起来很模糊 我深表歉意 但我不知道还能怎么说 我正在尝试构建一个 iPad 应用程序 让用户可以使用他们需要的工具填充工作区 我需要一个让用户将组件拖放到应用程序界面中的示例 例如 如果我有一个应用程序 用户可以制作表单 并且我希望
  • 在Python中从列表元素中查找互斥集合的组合

    在我目前正在进行的一个项目中 我已经实现了大约 80 我希望我的程序完成的任务 我对结果非常满意 在剩下的 20 中 我面临着一个让我有点困惑的问题 不知道如何解决 这里是 我想出了一个包含多个数字 任意长度 的列表列表 例如 listEl
  • Bundler::RubyVersionMismatch:您的 Ruby 版本是 1.9.3,但您的 Gemfile 指定为 2.0.0

    我正在使用带有 Pow Ruby Rails 和一堆有用的 gem 的 Mac 最近 每当我尝试打开我的应用程序时 都会遇到此错误 Bundler RubyVersionMismatch 您的 Ruby 版本是 1 9 3 但您的 Gemf
  • 翻译大量文本数据的最佳方法是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我有很多文本数据 想将其翻译成不同的语言 我知道的可能的方法 谷歌翻译 API 必应翻译器 API 问题是这些服务都对文字长度 通话次数等都有限制
  • 编辑 jar 内的 .properties 文件,无需解压或更改为 .zip 格式

    我目前参与的一个项目需要加载位于 jar 文件内的属性文件 并且我需要编辑 tat properties 文件 我在谷歌上搜索了一下 看到了实现这个想法的多种不同方法 说我需要将其重命名为 zip 文件 并在再次编辑后转换为 jar 但我对
  • 如何获取 SVG tspan 元素的宽度

    我正在尝试获取 a 的渲染宽度tspan元素 位于textSVG 中的元素 这是我的标记
  • 通过 URL 打开 Native AIR 应用程序?

    我希望人们能够通过 URL 启动 Native AIR 应用程序 我的 AIR 应用程序会读取其中的一些参数并打开到正确的状态 因此 用例是有人浏览我们的网站 然后单击链接 它将打开本机桌面应用程序以查看与其链接关联的正确内容 我知道 iT
  • 从 Matlab 函数返回多个输出变量

    可以说我有一个功能 function A B C test x y z A 2 x B 2 y C 2 z end 当您按运行时 Matlab 仅返回输出参数中的第一个值 A 在这种情况下 是否有一个命令可以放入我的函数中 自动返回所有函数
  • 捕获 ASP.NET UserControls 中未处理的异常

    我动态加载用户控件 将它们添加到 Web 表单的 Controls 集合中 如果用户控件在渲染时导致未处理的异常 我想隐藏它们 因此 我尝试挂钩每个 UserControl 的 Error 事件 但似乎 UserControl 永远不会像