iT邦幫忙

0

ASP.NET FileUplad控制項搭MasterPage.master問題

各位先進好:
我想請問各位是否有遇過相關問題:
我拉ASP.NET FileUplad控制項,EX:FileUplad1, FileUplad2, FileUplad3,然後跑
FileUpload fileUpload = null;
for(i = 1; i<=3; i++){
fileUpload = (FileUpload)Page.FindControl("FileUpload" + i);
}
if (fileUpload.HasFile){ //判斷不到FileUpload這個控制項裡面有檔案
...
}
以上在HasFile無法做判斷,但將MasterPage.master拿掉就可以正常判斷,想必可能是MasterPage.master影響所致,所以為了套用MasterPage.master,我將FileUpload不跑for廻圈,單獨抓取控制項ID就可正常運作,EX:
if (FileUpload1.HasFile){...}
if (FileUpload2.HasFile){...}
if (FileUpload3.HasFile){...}

今天又想將FileUpload加上javascript進度表的顯示,測試後好像也是受MasterPage.master的影響,無法正常套用,拿掉MasterPage.master即可正常運作,因網路上找的範例都是沒有套用MasterPage.master,所以不會查覺有此問題,不知各位大大是否也有遇過相關問題,或相關解法呢?

看更多先前的討論...收起先前的討論...
外獅佬 iT邦大師 1 級 ‧ 2013-06-05 00:05:53 檢舉
leo226提到:
javascript進度表的顯示,測試後好像也是受MasterPage.master的影響,無法正常套用

不要亂栽贓....javascript在整個頁面送到client端之後才會有作用
在送給client端之前,masteroage早就跟content解析、組成同一個html串流送出了...
請認真測試,不要把莫須有的罪名塞給無辜、無言的機制。
外獅佬 iT邦大師 1 級 ‧ 2013-06-05 00:07:23 檢舉
asp.net並不是到了client端才去解析tag並轉成html的...
肯定是你的javascript某個環節有問題。
讚
leo226 iT邦新手 5 級 ‧ 2013-06-05 23:12:03 檢舉
嗯,不好意思,我測試結果確實如此~或許背景知識不夠強,但我只是把我測試結果說明出來而已~
因為我程式碼完全沒改,只是把套用Master拿掉,並把Master裡的東西全部寫到同一個.aspx的檔案裡就OK了~謝謝指正!
8
player
iT邦大師 1 級 ‧ 2013-06-04 21:03:05

你在想什麼?

FileUpload fileUpload = null;
for(i = 1; i<=3; i++){
fileUpload = (FileUpload)Page.FindControl("FileUpload" + i);
}
if (fileUpload.HasFile){ //判斷不到FileUpload這個控制項裡面有檔案
...
}
這樣fileUpload 在回圈內就會被蓋掉了
你不如宣告陣列
或是把處理的部份搬進回圈裡

你的問題與MasterPage 無關
如果還是抓不到FileUpload 的話
用IDE設斷點
到裡頭用監看式去看控制項, 看不是來源抓錯了?

leo226 iT邦新手 5 級 ‧ 2013-06-05 23:05:33 檢舉

嗯,不好意思,我沒有PO完整的程式碼,造成誤會了,因為程式碼已經被我改掉了,我只PO我印象中的部份,少PO了一段!
for(i = 1; i<=3; i++){
fileUpload = (FileUpload)Page.FindControl("FileUpload" + i);
Upload(fileUpload);
}
少寫了一個Upload的method,應該是抓到FileUpload控制項後會丟到method做一些判斷及上傳~
而在method才是出現問題的地方,不好意思~這樣補充程式碼說明或許清楚一些了!
public void Upload(FileUpload fileUpload){
if (fileUpload.HasFile){ //判斷不到FileUpload這個控制項裡面有檔案
...
}
}

8
丁丁 (Dean)
iT邦大師 6 級 ‧ 2013-06-04 23:46:40

請參考保哥的 blog http://blog.miniasp.com/post/2007/10/30/How-to-use-FindControl-when-applying-MasterPage.aspx
沒有 MasterPage 的情況

&lt;pre class="c" name="code">    this.FindControl( ... )

有套用 MasterPage 的情況

&lt;pre class="c" name="code">    this.MasterPage.FindControl( ... ) 
看更多先前的回應...收起先前的回應...
外獅佬 iT邦大師 1 級 ‧ 2013-06-05 00:02:03 檢舉

不是吧...把FileUpload放在masterpage...這個...少見啊....暈

leo226 iT邦新手 5 級 ‧ 2013-06-05 22:57:52 檢舉

不是把FileUpload放在masterpage啦,是說這個頁面有套用masterpage與沒有套用masterpage時的狀況!
this.MasterPage.FindControl( ... ) <==這個方法我或許可以試看看,謝謝哦!

leo226 iT邦新手 5 級 ‧ 2013-06-05 23:07:54 檢舉

this.MasterPage.FindControl( ... )<==這個抓取的方法該不會是把FileUpload寫在MasterPage裡面抓取的方法吧,我沒有寫在MasterPage哦,只是當有套用MasterPage時候會有問題
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
..................
</asp:Content>

外獅佬 iT邦大師 1 級 ‧ 2013-06-06 08:52:03 檢舉

你的問題與MSDN上這個問題一樣:FindControl() doesn't work if page has MasterPage

leo226 iT邦新手 5 級 ‧ 2013-06-24 01:41:18 檢舉

當我在behindcode裡使用this.MasterPage時,它顯示不包含MasterPage的定義也,真的不知道怎麼使用這語法,有範例可以參考嗎?

0
外獅佬
iT邦大師 1 級 ‧ 2015-03-25 23:55:04

這裡呢,我假設你的Master Page裡頭的ContentPlaceHolder的ID叫做『contentBody』
所以呢你的code應該是長這樣的

&lt;pre class="c" name="code">
ContentPlaceHolder contentPlaceHolder = (ContentPlaceHolder)Master.FindControl("contentBody");
if(contentPlaceHolder != null)
{
  FileUpload fileUpload = null;
  for(i = 1; i&lt;=3; i++){
    fileUpload = (FileUpload)contentBody.FindControl("FileUpload" + i); 
    if(fileUpload != null)
    {
      if (fileUpload.HasFile){
        ....... // 處理你的上傳檔案
      }
    }
  }
}
外獅佬 iT邦大師 1 級 ‧ 2015-03-26 00:00:27 檢舉

所有套用了master page的頁面,都必須透過ContentPlaceHolder去找到你要的server control
為什麼?
因為一個頁面裡頭ContentPlaceHolder並沒有限制只能有一個的緣故。
請記住一個原則,爸爸找兒子,兒子找孫子......
不使用MasterPage的頁面,之所以可以用this.FindControl或Page.FindControl
因為那些Server Control就是Page的兒子
而使用了MasterPage的頁面,除了那些本來就在MasterPage上的server control以外,其他的都不是他的兒子,阿公是不能直接去找孫子的....
其實ContentPlaceHolder也是MasterPage上的一個Server Control
所以,根據上一代找下一代的原則,只能從最元祖的Master開始往下找.....
原理就這樣....打完收工暈

我要發表回答

立即登入回答