2010-03-22 72 views
1

我们有一个用c#编写的可更新的网站项目,它具有使用母版页,皮肤,用户控件等常用的web表单实现。 。到目前为止,我们忽略了将默认编译语言从VB更改为C#。但是,第二个我们改变它,我们看到下面的错误。将asp.net编译中的默认语言从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是一个字符串值,无论是“真”或“假” 。出于某种原因,这在VB编译下工作,但在C#中失败。

解决的办法是将foo的类型从字符串更改为布尔值。总而言之,非常奇怪的边缘情况!

回答

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的直接投射将在此cas中失败e因为Eval(“foo”)不是布尔值。