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

http://www.cnblogs.com/volnet/archive/2008/01/31/1059361.html

在制作控件的时候容易遇到“呈现控件时出错”“发生了未处理的异常。未将对象引用设置到对象的实例。”这样的错误,如下图:(也有可能仅仅只是因为未设置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的相关方法的由于页面总是会存在,因此我们不会经常看到它们出异常,在设计控件的时候我们更应该注意。

转载于:https://www.cnblogs.com/ruijian/archive/2011/02/16/1956130.html

如何解决“呈现控件时出错”的问题(转)相关推荐

  1. aspx创建控件时出错,服务器标记的格式不正确

    aspx创建控件时出错,服务器标记的格式不正确  找了半天 原来是多了个'号

  2. 创建控件时出错,未将对象引用设置到对象实例解决方法

    第一步,首先关闭aspx页面 第二步,在单击项目右击,选择"清理" 第三步,然后在打开aspx页面,就可以看到正常的页面了. 注:一次不行的话,多做几次. 如果还是不行的话,就看看 ...

  3. asp.net button创建控件时出错_Tkinter Radiobutton控件

    单选按钮是一种可在多个预先定义的选项中选择出一项的 Tkinter 控件 .单选按钮可显 示文字或图片,显示文字时只能使用预设字体,该控件可以绑定一个 Python 函数或方 法,当单选按钮被选择时, ...

  4. 使用控件时提示“未声明标识符“的解决方法

    使用控件时提示"未声明标识符"的解决方法 参考文章: (1)使用控件时提示"未声明标识符"的解决方法 (2)https://www.cnblogs.com/Ro ...

  5. 使用WebBrowser控件时在网页元素上绘制文本或其他自定义内容

    第一次在CNBlogs上发Post是提出一个有关使用WebBrowser控件时对SELECT网页元素操作的疑惑,这个问题至今也没有解决,后来有朋友在该Post的评论里询问WebBrowser控件如何在 ...

  6. C# 多线程修改控件时遇到:创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke

    一般在多线程调用UI控件时,涉及到跨线程修改UI,需要使用委托,比如如下: this.Invoke((MethodInvoker)delegate{btnRefresh.Enabled = true; ...

  7. 用了GradientDrawable后,当点击控件时,控件大小发生变化

    android新手:发现一个很奇怪的问题,用了GradientDrawable后,当点击控件时,程序自动使我的一些控件大小保持一致,为什么呢,我就是不想它们保持一致啊 改了好久好久:GradientD ...

  8. 给echarts添加筛选时间控件时,控件不显示,并设置数据库无数据时echarts模块显示暂无数据

    给echarts模块添加时间控件时,控件无效,经检查发现,控件被画布遮盖了,需要用一个form标签包括时间控件,否则时间控件不生效.另外,如果echarts从后台获取到的数据为空,需要提示暂无信息.这 ...

  9. 解决dev控件版本过期问题

    解决dev控件版本过期问题 参考文章: (1)解决dev控件版本过期问题 (2)https://www.cnblogs.com/lixioayi/p/9533024.html 备忘一下.

最新文章

  1. Failure [DELETE_FAILED_INTERNAL_ERROR]的解决办法
  2. [网络安全提高班] 一〇一.网络攻防溯源普及和医疗数据安全总结
  3. deprecated_@Deprecated新外观可能是什么?
  4. js判断是否在iframe中
  5. Intellij IDEA神器常用技巧六-Debug详解
  6. Ant 基本语法的使用示列
  7. python查找并修改文件中的内容_如何使用Python搜索和替换文件中的文本?
  8. 基于机器视觉的线圈检测
  9. U盘安装CentOS7的最终解决方案
  10. 颠覆QQ,干掉微信?腾讯内测“朋友”,会是下一个国民社交APP吗
  11. RubyOnRails杂记
  12. 【机器学习】偏差-方差分解
  13. [GAMES101]现代计算机图形学课程总结3:Shading
  14. arcgis 实验教程--ModelBuilder与空间建模
  15. 青浦区科技小巨人企业和区科技小巨人培育企业给予45万元和30万元的资助
  16. 上海电机学院计算机科学与技术专业怎么样,上海电机学院计算机科学与技术专业2016年在上海理科高考录取最低分数线...
  17. Android12 Launcher3 的一些修改记录
  18. 华硕K55VD安装ubuntu 18.04
  19. <昆工>2019级学科竞赛进阶实训(程序设计)大作业
  20. robotframework 内置库BuiltIn学习笔记

热门文章

  1. Python-Matplotlib可视化(1)——一文详解常见统计图的绘制
  2. java中将查询数据导出_如何在R中将数据框导出到Excel
  3. Android CheckBox
  4. Elasticsearch的javaAPI之facet,count,delete by query
  5. 前端教程:HTML5有哪些新特性?
  6. VLOOKUP函数返回查询值左侧的数据
  7. 初步接触XCode和IPhone Simulator
  8. SEO哪些因素会照成百度排名不稳定
  9. Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口
  10. 51Nod 1046 A^B Mod C(日常复习快速幂)