2012-02-23 164 views
-1

有一個獨特的客戶請求,我不知道如何處理。C#攔截瀏覽按鈕

客戶擁有帶瀏覽按鈕的網頁表單來選擇文件。當瀏覽按鈕被點擊時,他們不想顯示本地文件,而是想用一個文本框彈出一個窗口來輸入代碼。此代碼然後用於從包含1000個文件的本地文件夾中選擇一個文件,每個文件都有自己的代碼。他們希望阻止用戶查看該文件夾中的其他文件。

我編寫了一個自定義Windows窗體來模仿網頁表單,但他們已經在網頁上,並希望重用它。

任何想法如何攔截瀏覽按鈕?我可以在Web瀏覽器組件中使用C#應用程序,但可以攔截瀏覽按鈕嗎?

+5

你有一個釘子。你在問:「我怎麼擰這個釘子?」答案是,不要使用釘子,使用螺絲。 – asawyer 2012-02-23 12:52:13

+0

另外 - 這個方案究竟會如何阻止人們直接輸入隨機代碼,直到他們碰到一個他們不應該訪問的文件? – asawyer 2012-02-23 12:56:36

+0

這些文件在用戶的計算機上?你意識到用戶可以查看這些文件,只要他們在他的電腦上? – 2012-02-23 13:15:58

回答

0

不顯示實際的文件瀏覽器,模仿其中一個是表示在只有一個文件。

或者因爲你知道文件路徑時,輸入正確的密碼複製您創建的文件到臨時文件夾和打開文件瀏覽器瀏覽該文件夾,它將只包含該文件。

+0

你怎麼不顯示實際的文件瀏覽器?請記住,這是從服務器加載的實際網頁,而不是從本地計算機加載的網頁。 – Christian 2012-02-23 13:40:19

1

我可以看到的唯一選擇是使用C#應用程序和Web瀏覽器組件。然後,您可以使用WebBrowser.ObjectForScripting提供一個可稱爲通過Javscript觸發您的自定義選擇器窗口的方法,例如:

window.external.ShowPickerWindow(); 

然後你有兩種選擇:

  1. 訊問頁面的DOM一次它被加載並用觸發你的選擇器窗口的按鈕替換。
  2. 讓客戶更改他們的頁面,以便檢查是否存在window.external.ShowPickerWindow方法,並基本上爲您選擇(1)。

然後,您可以使用一種方法,也許稱爲window.external.GetPickedCode()將代碼拉出頁面。

1

Rob Kinder引導我沿着正確的思維軌道說「替換按鈕」,這導致我找到了一個精美的解決方案!

簡而言之,我隱藏瀏覽按鈕,在它旁邊插入一個新按鈕,單擊它時用文本框打開一個新窗口。這個文本框然後在父窗體中設置一個字符串值,用於onSubmit附加文件。

private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     HtmlElement btnBrowse = wb.Document.GetElementById("fiPhoto"); 
     if (btnBrowse != null) 
     { 
      HtmlElement newbtn = wb.Document.CreateElement("input"); 
      newbtn.SetAttribute("id", "btnLoad"); 
      newbtn.SetAttribute("type", "button"); 
      newbtn.SetAttribute("value", "Load"); 
      newbtn.Click += new HtmlElementEventHandler(newbtn_Click); 
      btnBrowse.Parent.AppendChild(newbtn); 

      btnBrowse.Style = "display:none"; 
     } 

     HtmlElementCollection forms = wb.Document.Forms; 
     if (forms.Count > 0) 
     { 
      HtmlElement form = wb.Document.Forms[0]; 
      form.AttachEventHandler("onsubmit", delegate(object o, EventArgs arg) 
       { 
        FormToMultipartPostData postData = new FormToMultipartPostData(wb, form); 
        postData.AddFile("photo", photo); 
        postData.Submit(); 
       }); 
     } 
    } 

    private void newbtn_Click(object sender, EventArgs e) 
    { 
     Form2 frm = new Form2(this); 
     frm.ShowDialog(); 
    } 

FormToMultipartPostData太大張貼在這裏,但它基本上是手工構建內容處置被張貼

+0

太棒了,我很高興你能工作。 – asawyer 2012-02-23 15:28:01