【问题标题】:C# Intercept Browse ButtonC#拦截浏览按钮
【发布时间】:2012-03-13 21:06:54
【问题描述】:

有一个独特的客户要求,我不确定如何解决。

客户有一个带有浏览按钮的网页表单,用于选择文件。当点击浏览按钮时,他们不想显示本地文件,而是想弹出一个带有文本框的窗口来输入代码。然后使用此代码从本地文件夹中选择一个文件,该文件夹包含 1000 个文件,每个文件都有自己的代码。他们希望阻止用户查看该文件夹中的其他文件。

我确实编写了一个自定义 Windows 表单来模仿网页表单,但他们已经将网页在线并希望重复使用它。

任何想法如何拦截浏览按钮?我可以将 C# 应用程序与 Web 浏览器组件一起使用,但这会拦截浏览按钮吗?

【问题讨论】:

  • 你有钉子。你在问,“我怎么拧这个钉子?”答案是,不要用钉子,用螺丝。
  • 另外 - 这个方案究竟如何阻止人们只是输入随机代码,直到他们点击一个他们也不应该访问的文件?
  • 文件在用户的电脑上?您确实意识到用户可以查看这些文件,只要它们在他的计算机上?
  • @asawyer:是的,但是你用什么尺寸的扳手拧螺丝?
  • 计算机在展览中,而不是在某人家中。浏览器将全屏显示,人们在看他们在做什么,所以他们不能只是去“探索”。对于您的问题“该方案究竟如何阻止人们输入随机代码,直到他们点击他们不应该访问的文件”.. 可以询问任何受密码保护的数据

标签: c# html webforms


【解决方案1】:

我看到的唯一可行的选项是使用带有 Web 浏览器组件的 C# 应用程序。然后,您可以使用WebBrowser.ObjectForScripting 提供一个方法,该方法可以调用以通过 Javscript 触发您的自定义选择器窗口,例如:

window.external.ShowPickerWindow();

然后你有两个选择:

  1. 在页面加载后询问其 DOM,并将按钮替换为触发选择器窗口的按钮。
  2. 让客户更改他们的页面,以便检查是否存在 window.external.ShowPickerWindow 方法,并基本上为您执行选项 (1)。

然后您可以有一个方法,可能称为window.external.GetPickedCode() 将代码拉出页面。

【讨论】:

    【解决方案2】:

    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 太大,无法在此处发布,但它基本上是手动构建要发布的 Content-Disposition

    【讨论】:

      【解决方案3】:

      不显示实际的文件浏览器,模仿一个只显示其中一个文件的浏览器。

      或者因为您知道输入正确代码时的文件路径,所以将文件复制到您创建的临时文件夹并打开文件浏览器以浏览该文件夹,它将仅包含该文件。

      【讨论】:

      • 如何不显示实际的文件浏览器?请记住,这是从服务器加载的实际网页,而不是从本地计算机加载的网页。
      猜你喜欢
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多