【问题标题】:Showing a folderBrowser Dialog from webapp MVC从 webapp MVC 显示一个文件夹浏览器对话框
【发布时间】:2017-11-29 03:35:06
【问题描述】:

对 c# 和 MVC 来说非常陌生。我有一个 MVC 应用程序设置,其中一个 webapp 在类似浏览器控件的 chrome 下运行。我在 webapp (html) 中有按钮,用户可以从中选择他想要的文件夹,然后我想要它们的实际路径。

为此,我正在向我的 MVC 控制器发出 ajax 请求,该控制器将打开 folderBrowserDialog (System.Windows.Forms),然后将路径作为 ajax 响应返回。当我使用 Visual Studio 运行应用程序时,一切正常。但是在制作应用程序包并安装exe之后,文件夹BrowserDialog根本没有出现。没有错误抛出 ajax 响应,正确的值为 null

这里是代码(部分)

selectFolderGlobal 是一个全局变量

public JObject OpenFolderExplorer()
    {
        try
        {
            Thread fb= new Thread(new ThreadStart(openFileBrowser), 1);
            fb.SetApartmentState(ApartmentState.STA);
            fb.Start();
            fb.Join();
            JObject selectedFolder = new JObject();
            selectedFolder.Add("selectedFolder", selectedFolderGlobal);
            return selectedFolder;
        }
        catch (Exception ex)
        {
            Logger.Log(" Exception: " + ex.Message);
            JObject errorcode = JObject.Parse(mConstants.EXCEPTION);
            return errorcode;
        }
    }


private void openFileBrowser()
    {
        try
        {
            var fbd= new FolderBrowserDialog();
            fbd.ShowNewFolderButton = false;
            DialogResult result = fbd.ShowDialog(new Form() { TopMost = true, WindowState = FormWindowState.Minimized });
            if (result == DialogResult.OK)
            {
                selectedFolderGlobal= fbd.SelectedPath;
            }
        }
        catch (Exception ex)
        {
            Logger.Entry(" Exception: " + ex.Message);
        }
    }

Ajax 响应是这样返回的

{
  "selectedFolder":null
}

任何人都知道为什么它可能仅在创建包之后发生(在生成 .exe 之后)? System.Windows.Forms.dll 被添加到依赖项中(如果不是,它应该引发异常,甚至包构建都会失败)

【问题讨论】:

  • 刚刚用本地托管的 IIS 调试它得到一个异常导致这个 SO 链接:stackoverflow.com/questions/8928713/…(“当应用程序未在 UserInteractive 模式下运行时显示模式对话框或表单不是有效操作. 指定 ServiceNotification 或 DefaultDesktopOnly 样式以显示来自服务应用程序的通知。")
  • 用上面的消息搜索给出了一个想法,它可能是不可能的,但是在所有东西(客户端、服务器)都在同一台机器上的情况下,真的无法弄清楚是否有解决方法或不 。 “ServiceNotification 或 DefaultDesktopOnly 样式显示来自服务应用程序的通知” - 可能有办法做到这一点

标签: c# ajax


【解决方案1】:

您正在尝试在 Web 服务器上打开浏览文件夹对话框,用户浏览器正在他的本地计算机上运行,​​即使此工作用户无法看到您在服务器上提出的对话框,这些都是单独的计算机。而web应用只有web应用根目录下的文件使用权限,不能使用其他文件夹,真的不需要。

您必须了解 Web 应用程序的工作原理,所有 c# 代码都在服务器上执行,并且 c# 代码生成 html、css、javascript 和其他文件,然后浏览器下载该内容并在本地计算机上使用它。浏览器渲染html,执行javascript...

当您在本地主机上调试时,您的计算机既是服务器又是客户端,这就是它在 VS 中工作的原因,您可能在本地计算机上以管理员身份运行它。

【讨论】:

  • 谢谢你。整个 Web 应用程序在附加的 Web 浏览器控件中的 Windows 窗体内运行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多