2013-03-07 5 views
-1

서버 컨트롤을 만들고 test.aspx 코드가 아래에 나와 있습니다.asp.net 서버 컨트롤에서 null 값 반환을 피하는 다른 방법은

dll이로드되면 RenderContents() 함수가 호출됩니다.
DataSource 속성으로 제어 전송 이지만 ViewState["DataSource"]null을 반환합니다.

ViewState["DataSource"] = _Pages_dummy; 

내 질문입니다 - -

그것을 방지하기 위해 , 내가 사용 ViewState["DataSource"] 초기화? ViewState["DataSource"]null 값을 반환하지 않도록 을 내가 초기화를 사용하지 않으려면, 어떤 다른 방법은 "

있다

==================================== ===================

using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace ServerControl2 
{ 
    [DefaultProperty("Text")] 
    [ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1>")] 
    public class ServerControl1 : WebControl 
    { 
     private string[,] _Pages_dummy= { {"1","2","3","4"} , {"11","22","33","44"}}; 

     public ServerControl1() 
     { 
      ViewState["DataSource"] = _Pages_dummy; 
      // if user do not initialize viewstate , we use dummmey array . 
     } 

     public ServerControl1(string[,] pages)   
     { 
      ViewState["DataSource"] = pages; 
      // user must initialize viewstate . 
     } 

     [Bindable(true)] 
     [Category("Appearance")] 
     [DefaultValue("")] 
     [Localizable(true)] 
     public string[,] DataSource 
     { 
      get 
      { 
       return (string[,])ViewState["DataSource"]; 
      } 
      set 
      { 
       ViewState["DataSource"] = value; 
      } 
     }  
     [Bindable(true)] 
     [Category("Appearance")] 
     [DefaultValue("")] 
     [Localizable(true)] 
     protected override HtmlTextWriterTag TagKey 
     { 
      get 
      { 
       return HtmlTextWriterTag.Div; 
      } 
     } 

     protected override void RenderContents(HtmlTextWriter output) 
     { 
      output.WriteBeginTag("div"); 

      if (DataSource != null) 
      { 
        for (int i = 0; i < DataSource.GetLength(0); i++) 
        { 
         for (int j = 0; j < DataSource.GetLength(1); j++) 
         { 

         } 
        } 
      }  
     } // RenderContents  
    }// class 
}// namespace 

test.aspx.cs viewstate가이 데이터 소스 속성에 null의 경우

  ServerControl2.ServerControl1 n1 = new ServerControl2.ServerControl1();      
      n1.DataSource[0,0] = "hjkhjk"; 
      n1.DataSource[0,1] = "jkljk"; 
      n1.DataSource[0,2] = "hjk"; 
      n1.DataSource[0,3] = "fjgfjhhgj"; 
      Response.Write(n1.DataSource[0,0]); 
      Response.Write(n1.DataSource[0,1]); 
      Response.Write(n1.DataSource[0,2]); 
      Response.Write(n1.DataSource[0,3]); 
+1

귀하의 궁금한 점은 무엇입니까? –

+2

나는 이것을 왜 원하는지 확실히 알 수는 없지만 ViewState [ "DataSource"]에 항상 값을 지정하려면 * something *로 초기화해야합니다. 그것은 비어 있음으로 시작합니다. –

+0

viewstate 변수에 값을 넣지 않고 검색하려고하면 null 이외의 값을 검색 할 수 있습니까? – dave823

답변

0

확인합니다. Viewstate ("Datasource") 대신에 속성을 직접 사용하는 한 괜찮을 것입니다.

[Bindable(true)] 
[Category("Appearance")] 
[DefaultValue("")] 
[Localizable(true)] 
public string[,] DataSource 
{ 
    get 
    { 
     string[,] value = (string[,])ViewState["DataSource"]; 
     if (value == null) { 
      return __Pages_dummy 

     } 
     return value ; 
    } 
    set 
    { 
     ViewState["DataSource"] = value; 
    } 
} 
+0

시도했습니다 string [,] value = (string [,]) ViewState [ "DataSource"]; if (value == null) { return _Pages_dummy; } 반환 값; 잘 작동합니다. 그러나 _Pages_dummy의 크기가 무엇인지 알 수있는 방법은 무엇입니까? 다양한 시나리오에서 다를 수 있습니다. _Pages_dummy 크기를 추측 할 수 없습니다. –

+0

문자열 [,] 값 = (문자열 [,]) ViewState [ "DataSource"]; if (value == null) {return null; } 반환 값; 이제 작동 중입니다. 고맙습니다. –