2010-03-22 55 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」)不是布爾值。