对c#和MVC来说很新。我有一个MVC应用程序设置,其中一个webapp在Chrome浏览器控件下运行。我在webapp(html)中有一个按钮,用户可以从中选择他想要的文件夹,然后我想要它们的实际路径。
为此,我正在向我的MVC控制器发出ajax请求,该控制器将打开folderBrowserDialog(System.Windows.Forms),然后返回路径作为ajax响应。当我使用visual studio运行应用程序时,一切正常。但是在创建应用程序包并安装exe之后,folderBrowserDialog根本就不会出现。没有错误抛出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被添加到依赖项中(如果它不应该抛出一个exeption,甚至包构建都会失败)
答案 0 :(得分:1)
您正在尝试在Web服务器上打开浏览文件夹对话框,用户浏览器正在其本地计算机上运行,即使此工作用户无法看到您在服务器上引发的对话框这些是单独的计算机。并且Web应用程序仅在Web应用程序根目录下具有文件使用权限,您不能使用其他文件夹,实际上您根本不需要它。
您必须了解Web应用程序的工作原理,所有c#代码都在服务器上执行,并且c#代码生成html,css,javascript和其他文件,然后浏览器下载该内容并在本地计算机上使用它。浏览器呈现html,执行javascript ...
当您在本地主机上进行调试时,您的计算机既是服务器又是客户端,这就是在VS中工作的原因,您可能在本地计算机上以管理员身份运行它。