如何解决““.NET研究”呈现控件时出错”的问题

简介:   Webpart部署后在SPD中打开显示呈现控件时出错,后查到这篇文章,主要问题是在CreateChildControls中调用了this.page.Header,在设计视图时,该对象可能还不存在,以后编码时要注意在CreateChildControls尽量不调用数据库/文件系统读取、变量未附初值、调用了类似Page的属性如Session,Page.Request.QueryString等。

  Webpart部署后在SPD中打开显示呈现控件时出错,后查到这篇文章,主要问题是在CreateChildControls中调用了this.page.Header,在设计视图时,该对象可能还不存在,以后编码时要注意在CreateChildControls尽量不调用数据库/文件系统读取、变量未附初值、调用了类似Page的属性如Session,Page.Request.QueryString等。

  在制作控件的时候容易遇到呈现控件时出错发生了未处理的异常。未将对象引用设置到对象的实例。这样的错误,如下图:(也有可能仅仅只是因为未设置runat="server"标签而导致该错误,请先检查该项。)

ControlErrorOnRender

  但是在编译时/运行时也都是没有错误的。

  分析

  如图所示的情况我们称之为设计时以区别于编译时/运行时。

  设计时:在ASP.NET环境中也就是当我们在Visual Studio中使用网页设计器进行编辑的时候。直接的理解就是在ASPX页面切换到设计的时候。

  编译时:直接的理解就是当你进行编译的时候,通常这个时候的错误是由类型检查,参数匹配等显式可直接通过语法约束所限制的错误。

  运行时:直接的理解就是当你进行预览/运行的时候。通常这个时候的错误则是由具体的异常,逻辑错误所组成的。

  让我们分析控件在设计时的表现,我们的控件在设计时的时候,VS智能地模拟输出控件在运行时的样貌,控件的呈现通过了一定顺序的方法,并最终形成了当前输出。按照标准,我们应该是在Render或RenderContents中对控件进行了输出的操作(事实上其他也是可以,但我们通常也不那么做,或者说更多的呈现控件时出错的异常主要来自于Render或RenderContents)。

  从错误的提示未将对象引用设置到对象的实例。从这一句话来看,也就是说,有一个或者以上的对象的实例在没有赋初值的情况下就被使用了。

  让我们窥视一下我们的代码:

 
 
protected override void RenderContents(HtmlTextWri上海企业网站设计与制作ter writer)
{
UpButton.Text
= Page.Server.HtmlDecode(UpButton.Text);
DownButton.Text
= Page.Server.HtmlDecode(DownButton.Text);
base .RenderContents(writer);
}

  因为该控件在设计的时候需要有一个向上的按钮和一个向下的按钮,分别需要用两个特殊的标点符号向上和向下,而这两个符号需要通过设置如下所示的代码编号才可以正确地被浏览器呈现:

 
 
private string upButtonText = " and; " ;
private string downButtonT上海徐汇企业网站设计与制作ext = " or; " ;

  而这两个符号在呈现前却会被页面进行一个HtmlEncode方法编译后再输出,而这两个特殊的标志却只能通过直接输出的方式进行呈现,也就是说在HtmlEncode之后只能将该特殊标志以文本的形式输出and; or上海企业网站制作;而不会输出向上和向下的箭头。这时候我们需要引入它的反向方法Page.Server.HtmlDecode进行解码,注意到这里我们使用了Page实例,该实例只有在页面真实存在的情况下才为非空,否则后续的操作将是对null的操作,而这样的操作将会显示未将对象引用设置到对象的实例。这样的错误。

上海徐汇企业网站制作>  设计时:我们刚才提到了,设计时仅仅只是模拟页面呈现的过程,而页面事实上是不存在的。因此在这个时候Page对象的实例将为空,后续的调用将引发异常。

  假设说我们只有这个方法用于处理当前所需要的行为,那么我们在调用Page的时候必将导致null的对象并致使后续操作发生异常。这个时候我们引入设计模式这个概念(非DesignPattern而是DesignMode),DesignMode是由Control类的一个受保护的(protected)属性,它获取一个值,用以指示该组件当前是否处于设计模式。这里的设计模式也就相当于设计时的概念。

  因此我们可以将代码改造为如下形式:

 
 
protected override void RenderContents(HtmlTextWriter writer)
{
if ( ! DesignMode)
{
UpButton.Text
= Page.Server.HtmlDecode(UpButton.Text);
DownButton.Text
= Page.Server.HtmlDecode(DownButton.Text);
}
base .RenderContents(writer);
}

  这样只有在非设计时的时候,我们才引入Page对象的实例,因此设计时的异常将迎刃而解。

  总结

  因此在设计控件的时候,特别是在考虑控件呈现的时候,为了避免类似异常的发生,我们应该考虑该控件在设计时能够获取足够的资源,对于未能获取资源的项,我们应该显式将其区分(如上代码中使用DesignMode来判断是否为设计时要执行的代码)。

  扩展

  刚才我们所见到的情形可以归结为在设计时无法引用具体实例所导致的异常,类似该异常的还会有数据库/文件系统读取、变量未附初值、调用了类似Page的属性如Session,Page.Request.QueryString等。在页面设计的时候由于以上部分方案特别是调用到Page的相关方法的由于页面总是会存在,因此我们不会经常看到它们出异常,在设计控件的时候我们更应该注意。

目录
相关文章
|
4月前
|
开发框架 JavaScript 前端开发
震撼!破解 ASP.NET 服务器控件 Button 执行顺序之谜,颠覆你的开发认知!
【8月更文挑战第16天】在ASP.NET开发中,通过Button控件实现先执行JavaScript再触后台处理的需求十分常见。例如,在用户点击按钮前需前端验证或提示,确保操作无误后再传递数据至后台深度处理。此过程可通过设置Button的`OnClientClick`属性调用自定义JavaScript函数完成验证;若验证通过,则继续触发后台事件。此外,结合jQuery也能达到相同效果,利用`__doPostBack`手动触发服务器端事件。这种方式增强了应用的交互性和用户体验。
52 8
|
2月前
|
开发者 Windows
.NET 开源扁平化、美观的 C/S 控件库
【10月更文挑战第23天】介绍了三款适用于 .NET 平台的开源扁平化、美观的 C/S 控件库:MaterialSkin 采用 Google Material Design 风格,适合现代感界面;Krypton Toolkit 提供丰富控件,界面易于定制;Fluent Ribbon Control Suite 模仿 Office 界面,适合复杂功能应用。每款控件库均附有示例代码及 GitHub 链接。
108 0
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
|
2月前
|
C# Android开发 iOS开发
一组.NET MAUI绘制的开源控件 - AlohaKit
一组.NET MAUI绘制的开源控件 - AlohaKit
|
3月前
|
开发框架 JavaScript 前端开发
|
4月前
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
|
6月前
|
机器学习/深度学习 JSON 测试技术
CNN依旧能战:nnU-Net团队新研究揭示医学图像分割的验证误区,设定先进的验证标准与基线模型
在3D医学图像分割领域,尽管出现了多种新架构和方法,但大多未能超越2018年nnU-Net基准。研究发现,许多新方法的优越性未经严格验证,揭示了验证方法的不严谨性。作者通过系统基准测试评估了CNN、Transformer和Mamba等方法,强调了配置和硬件资源的重要性,并更新了nnU-Net基线以适应不同条件。论文呼吁加强科学验证,以确保真实性能提升。通过nnU-Net的变体和新方法的比较,显示经典CNN方法在某些情况下仍优于理论上的先进方法。研究提供了新的标准化基线模型,以促进更严谨的性能评估。
177 0
|
7月前
|
机器学习/深度学习 算法 数据可视化
MATLAB基于深度学习U-net神经网络模型的能谱CT的基物质分解技术研究
MATLAB基于深度学习U-net神经网络模型的能谱CT的基物质分解技术研究
|
7月前
|
SQL 开发框架 JavaScript
分享33个ASP.NET电子商务源码和40个ASP.NET控件组件源码,总有一款适合您
分享33个ASP.NET电子商务源码和40个ASP.NET控件组件源码,总有一款适合您
97 0
|
7月前
|
SQL 开发框架 前端开发
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
88 0