2014-09-21 2 views
0

클래스 수준에서 문자열 변수를 정의하고 성공적으로 파일을 업로드 한 후이 변수를 protected void UploadButton_Click(object sender, EventArgs e)으로 설정했습니다.함수에서 클래스 수준 변수로의 값 전달 항상 null

나는이 함수에서 다른 값 fileName을이 함수로 전달할 수 있도록 protected void btnSave_Click(object sender, EventArgs e) {}을 데이터베이스에 저장합니다. 값은 항상 null입니다. 내가 뭔가 잘못하고 또는 기능 Protected 유형으로 정의 된대로 null이 남아 있습니까

public partial class News: System.Web.UI.Page 
{ 
    string _fileName = null; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      // some code here...... 
     } 
    } 

protected void UploadButton_Click(object sender, EventArgs e) 
    { 
     if (FileUploadControl.HasFile) 
     { 
      try 
      { 
       System.IO.FileInfo f = new System.IO.FileInfo(FileUploadControl.PostedFile.FileName); 

       if (f.Extension.ToLower() == ".pdf" || f.Extension.ToLower() == ".doc" || f.Extension.ToLower() == ".docx") 
       { 
        //3MB file size 
        if (FileUploadControl.PostedFile.ContentLength < 307200) 
        { 
         string filename = Path.GetFileName(FileUploadControl.FileName); 
         if (!System.IO.File.Exists("../pdf/news/" + FileUploadControl.FileName)) 
         { 
          FileUploadControl.SaveAs(Server.MapPath("../pdf/research/") + filename); 
          StatusLabel.Text = "Upload status: File uploaded!"; 
          _fileName = FileUploadControl.FileName; 
         } 
         else 
         { 
          _fileName = null; 
          StatusLabel.Text = "File with this name already exsists, Please rename file and Upload gain"; 
         } 
        } 
        else 
        { 
         _fileName = null; 
         StatusLabel.Text = "Upload status: The file has to be less than 3MB!"; 
        } 
       } 
       else 
       { 
        _fileName = null; 
        StatusLabel.Text = "Upload status: Only PDF or Word files are accepted!"; 
       } 
      } 
      catch (Exception ex) 
      { 
       _fileName = null; 
       StatusLabel.Text = "Upload status: The file could not be uploaded. The following error occured: " + ex.Message; 
      } 
     } 
    } 
} 
+0

값 파일 이름은 동일한 클래스 내에서 액세스 할 수 있어야합니다. 코드를 디버그 했습니까? – mrsrizan

+0

@mrsrizan, 그렇습니다. 제대로 업로드 기능에서'fileName' 변수에 값을 할당하고 디버깅을했는데 저장 버튼을 클릭하면 항상 null입니다. – Learning

+0

정적으로 만들어야합니다. 정적 문자열 _fileName = null; – mrsrizan

답변

1

당신이 ... 당신이 가지고있는 page life cycle을 이해하는 기대 같은 ASP.NET 웹폼 꽤 작동하지 않습니다.

기본적으로 각 요청마다 페이지 개체가 처음부터 다시 만들어집니다. 두 번의 버튼 클릭으로 두 개의 요청이 생성되므로 각 요청마다 두 개의 페이지 인스턴스가 생성됩니다. 이런 방식으로 데이터를 공유 할 수 없습니다.

  • 이에 대한 ViewState를 사용

    당신은 이것을 극복하는 방법은 여러 가지가 있습니다. 이것은 기본적으로 직렬화 된 다음 클라이언트로 전송되는 객체입니다. 클라이언트는 각 다시 게시시이를 다시 보내고 사용자가 액세스 할 수 있도록 비 직렬화됩니다. 민감한 데이터를 내부에 두지 마십시오. 그래도 encrypt this data 수있는 시설이 있습니다.

  • Session을 사용하십시오. 그러나 이것은 매우 지저분해질 수 있으며 사용자가 동일한 페이지의 serveral 인스턴스를 열 때이 문제를 처리해야합니다.
+0

파일 업로드 이벤트에서'ViewState [ "_ fileName"]'을 의미합니다. – Learning

+0

답변에 설명 된 세션 개체의 문제 때문에 viewstate를 사용합니다. 상대적으로 예측할 수없는 경로를 저장하면 괜찮습니다. 절대 경로를 저장하면 어떤 종류의 토큰을 저장하는 코드를 리팩터링하거나 viewstate를 암호화 할 수 있습니다. –

+0

이것은 제한된 사용자 만 사용하는 applciation의 백엔드 섹션의 일부이므로 암호화에 대해 걱정할 필요가 없습니다. – Learning

관련 문제