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

分析
如图所示的情况我们称之为“设计时”以区别于“编译时”/“运行时”。
设计时:在ASP.NET环境中也就是当我们在Visual Studio中使用网页设计器进行编辑的时候。直接的理解就是在ASPX页面切换到“设计”的时候。
编译时:直接的理解就是当你进行编译的时候,通常这个时候的错误是由类型检查,参数匹配等显式可直接通过语法约束所限制的错误。
运行时:直接的理解就是当你进行预览/运行的时候。通常这个时候的错误则是由具体的异常,逻辑错误所组成的。
让我们分析控件在设计时的表现,我们的控件在设计时的时候,VS智能地模拟输出控件在运行时的样貌,控件的呈现通过了一定顺序的方法,并最终形成了当前输出。按照标准,我们应该是在Render或RenderContents中对控件进行了输出的操作(事实上其他也是可以,但我们通常也不那么做,或者说更多的“呈现控件时出错”的异常主要来自于Render或RenderContents)。
从错误的提示“未将对象引用设置到对象的实例。”从这一句话来看,也就是说,有一个或者以上的对象的实例在没有赋初值的情况下就被使用了。
让我们窥视一下我们的代码:
protected override void RenderContents(HtmlTextWriter writer)
{
UpButton.Text = Page.Server.HtmlDecode(UpButton.Text);
DownButton.Text = Page.Server.HtmlDecode(DownButton.Text);
base.RenderContents(writer);
}
因为该控件在设计的时候需要有一个向上的按钮和一个向下的按钮,分别需要用两个特殊的标点符号向上和向下,而这两个符号需要通过设置如下所示的代码编号才可以正确地被浏览器呈现:
private string upButtonText = "∧"; private string downButtonText = "∨";
而这两个符号在呈现前却会被页面进行一个HtmlEncode方法编译后再输出,而这两个特殊的标志却只能通过直接输出的方式进行呈现,也就是说在HtmlEncode之后只能将该特殊标志以文本的形式输出∧ ∨而不会输出向上和向下的箭头。这时候我们需要引入它的反向方法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的相关方法的由于页面总是会存在,因此我们不会经常看到它们出异常,在设计控件的时候我们更应该注意。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# vs2010
# 呈现控件时出错
# VS2010/MFC编程(常用控件:树形控件Tree Control控件创建h和实例)
# 使用VS2010 C#开发ActiveX控件(下)
# 完整代码打包下载
# 使用VS2010 C#开发ActiveX控件(上)
# asp.net GridView控件中模板列CheckBox全选、反选、取消
# asp.net 打印控件使用方法
# asp.net+jquery滚动滚动条加载数据的下拉控件
# Asp.net 菜单控件简洁版
# asp.net AjaxControlToolKit--TabContainer控件的介绍
# ASP.NET单选按钮控件RadioButton常用属性和方法介绍
# asp.net fileupload控件上传文件与多文件上传
# 是在
# 这个时候
# 而这
# 我们应该
# 让我们
# 是由
# 当你
# 有一个
# 都是
# 也就是说
# 情况下
# 事实上
# 这一
# 使用了
# 也不
# 也有
# 在这个
# 也就
# 将会
# 则是
相关文章:
如何用5美元大硬盘VPS安全高效搭建个人网站?
广州商城建站系统开发成本与周期如何控制?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
网站制作报价单模板图片,小松挖机官方网站报价?
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
如何通过虚拟主机快速搭建个人网站?
如何在Windows环境下新建FTP站点并设置权限?
定制建站方案优化指南:企业官网开发与建站费用解析
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
常州企业建站如何选择最佳模板?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
微信推文制作网站有哪些,怎么做微信推文,急?
建站主机CVM配置优化、SEO策略与性能提升指南
如何通过cPanel快速搭建网站?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
广平建站公司哪家专业可靠?如何选择?
建站与域名管理如何高效结合?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
如何通过老薛主机一键快速建站?
建站之星安装需要哪些步骤及注意事项?
建站ABC备案流程中有哪些关键注意事项?
存储型VPS适合搭建中小型网站吗?
红河网站制作公司,红河事业单位身份证如何上传?
北京的网站制作公司有哪些,哪个视频网站最好?
c# 在ASP.NET Core中管理和取消后台任务
如何通过万网虚拟主机快速搭建网站?
建站主机解析:虚拟主机配置与服务器选择指南
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
网站制作话术技巧,网站推广做的好怎么话术?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
如何在云指建站中生成FTP站点?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
零服务器AI建站解决方案:快速部署与云端平台低成本实践
定制建站流程解析:需求评估与SEO优化功能开发指南
建站之星与建站宝盒如何选择最佳方案?
建站之星2.7模板快速切换与批量管理功能操作指南
内网网站制作软件,内网的网站如何发布到外网?
青浦网站制作公司有哪些,苹果官网发货地是哪里?
平台云上自主建站:模板化设计与智能工具打造高效网站
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
建站之星免费模板:自助建站系统与智能响应式一键生成
C#如何使用XPathNavigator高效查询XML
如何快速搭建高效WAP手机网站?
建站主机是否等同于虚拟主机?
北京制作网站的公司,北京铁路集团官方网站?
建站之星如何快速解决建站难题?
网站制作难吗安全吗,做一个网站需要多久时间?
建站主机选购指南:核心配置优化与品牌推荐方案
*请认真填写需求信息,我们会在24小时内与您取得联系。