2012-02-23 118 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