2010-03-22 4 views
1

으로 변경하면 오류가 발생합니다. C#으로 작성된 업데이트 가능한 웹 사이트 프로젝트가 있으며 마스터 페이지, 스킨, 사용자 컨트롤 등을 사용하는 일반적인 웹 양식 구현이 있습니다. . 지금까지 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") %>'> 

"true"또는 "false" . 어떤 이유로,이 비주얼 베이직 컴파일에서 작동하지만 C#에서는 실패합니다.

해결 방법은 foo 유형을 문자열에서 bool로 변경하는 것입니다. 결국, 아주 이상한 엣지 케이스!

답변

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으로의 직접 전송은이 캐스퍼에서 실패합니다. e는 이므로 Eval ("foo")은 부울이 아닙니다.