我们有一个用c#编写的可更新的网站项目,它具有使用母版页,皮肤,用户控件等的常规Web表单实现。到目前为止,我们忽略了将默认编译语言从VB更改为C#。但是,第二个我们更改它,我们看到以下错误。
Object reference not set to an instance of an object. --->
System.NullReferenceException: Object reference not set to an instance
of an object. at ASP.Default.__DataBinding__control499(Object sender,
EventArgs e) at System.Web.UI.Control.OnDataBinding(EventArgs e) at
System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) at
System.Web.UI.Control.DataBindChildren() at
System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) at
System.Web.UI.Control.DataBindChildren() at
System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) at
System.Web.UI.Control.DataBindChildren() at
System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) at
System.Web.UI.Control.DataBindChildren() at
System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) at
....
进一步调查指出,此错误是从主题相关程序集生成的(来源:App_Theme_Default.zclakrlo)。有什么想法吗?
我的一位同事建议它可能与皮肤文件有关,因为我们有一个主题调用“默认”,并且无法在皮肤文件上指定语言。因此,当asp.net运行时尝试在C#下编译它时,它会给出名称冲突吗?这有意义吗?
感谢任何帮助。
更新: 事实证明,其中一个皮肤文件中有一个span标记,如下所示:
<span runat="server" visible='<%# Eval("foo") %>'>
其中foo是字符串值“true”或“false”。出于某种原因,这可以在VB编译下工作,但在C#中失败。
修复方法是将foo的类型从string更改为bool。总而言之,非常奇怪的边缘情况!
答案 0 :(得分:3)
这是因为这个控件的代码最终会为VB提炼出如下内容:
Public Sub __DataBinding__control499(ByVal sender As Object, ByVal e As EventArgs)
Dim control As HtmlGenericControl = DirectCast(sender, HtmlGenericControl)
Dim bindingContainer As IDataItemContainer = DirectCast(control.BindingContainer, IDataItemContainer)
control.Visible = CBool(MyBase.Eval("Foo"))
End Sub
...在C#中的位置是:
public void __DataBinding__control499(object sender, EventArgs e)
{
HtmlGenericControl control = (HtmlGenericControl) sender;
IDataItemContainer bindingContainer = (IDataItemContainer) control.BindingContainer;
control.Visible = (bool) base.Eval("foo");
}
CBool 实际上接受任何数字或字符串表达式,而从 Eval(“foo”)直接转换为 bool 在这种情况下失败,因为 Eval(“foo”)不是布尔值。