如果有一個需求,要求你在BS上實現文件夾上傳操作功能?你該如何實現?
ActiveX?Js插件?自定義控件 還是……
下面說說我們的實驗
實驗一 想到了WinForm 中的文件夾上傳
在WebForm中引用WinForm->“using System.Windows.Forms;” 這里要涉及線程操作
[DirectMethod]
public void TopBarClick(string strOpearate)
{
btnUpdateEmInfos(strOpearate);
}
protected void btnUpdateEmInfos(string strOperate)
{
if (strOperate == "導入")
{
Thread s = new Thread(new ThreadStart(FoldDialog));
//s.ApartmentState=ApartmentState.STA;
//COM提供的線程模型共有三種:Single-Threaded Apartment(STA 單線程套間)、Multithreaded Apartment(MTA 多線程套間)和Neutral Apartment/Thread Neutral Apartment/Neutral Threaded Apartment(NA/TNA/NTA 中立線程套間,由COM+提供)。
s.SetApartmentState(System.Threading.ApartmentState.STA);
s.Start();
}
}
/// <summary>
/// 文件夾彈出框
/// </summary>
private void FoldDialog()
{
FolderDialog d = new FolderDialog();
string path = string.Empty;
if (d.ShowDialog() == DialogResult.OK)
{
path = d.Path;
}
}
FolderBrowserFolder
namespace CRM_BS.WebUI.Common
{
public class FolderDialog : FolderNameEditor
{
FolderNameEditor.FolderBrowser fDialog = new System.Windows.Forms.Design.FolderNameEditor.FolderBrowser { StartLocation = System.Windows.Forms.Design.FolderNameEditor.FolderBrowserFolder.Desktop };//邏輯桌面
/// <summary>
/// 顯示文件夾瀏覽器對話框
/// </summary>
/// <returns></returns>
public DialogResult ShowDialog()
{
fDialog.Description = "請選擇文件夾" ;
return fDialog.ShowDialog();
}
/// <summary>
/// 獲取或設置文件夾上方顯示的說明
/// </summary>
/// <param name="description">文件夾上方說明</param>
/// <returns></returns>
public DialogResult ShowDialog(string description)
{
fDialog.Description = description;
return fDialog.ShowDialog();
}
/// <summary>
/// 文件夾目標路徑
/// </summary>
public string Path
{
get
{
return fDialog.DirectoryPath;
}
}
~FolderDialog()
{
fDialog.Dispose();
}
}
}
但是效果卻如下:
彈出框不是激活狀態
單擊彈出框 效果
要的就是這效果,但是功能上有缺陷……實驗一宣告失敗(如果你這樣成功了還請告知……)
實驗二 BS要這效果? 那JS應該可以 ,下手……
先看效果:
看上去,好像是滿足了需求
通過方法,還能順利取出路徑
再看代碼
JS代碼:
<%--導入--%>
<script language="javascript" type="text/javascript">
function BrowseFolder() {
try {
var Shell = new ActiveXObject("Shell.Application");
var Folder = Shell.BrowseForFolder(0, "請選擇文件夾", 0); //起始目錄為:桌面
if (Folder != null) {
Folder = Folder.items(); // 返回 FolderItems 對象
Folder = Folder.item(); // 返回 Folderitem 對象
Folder = Folder.Path; // 返回路徑
if (Folder.charAt(Folder.length - 1) != "\\") {
Folder = Folder + "\\";
}
//document.all.savePath.value = Folder;
//document.getElementById(savePath).value = Folder;
//hdPath.setValue(Folder);
//alert(document.all.savePath.value);
Ext.net.DirectMethods.GetPath(Folder);
//return Folder;
}
} catch (e) {
alert(e.message);
}
}
</script>
后台代碼:
//導入
(X.GetCtl("btnTopBarArrowDown") as Ext.Net.Button).Listeners.Click.Handler = "BrowseFolder();";
/// <summary>
/// 導入->確定 方法
/// </summary>
/// <param name="path"></param>
[DirectMethod]
public void GetPath(string path)
{
CommonMethod.Show("", path, Ext.Net.MessageBox.Icon.INFO);
}
雖然表面上看“功能實現,代碼也簡潔,可以說是很成功” 但卻犧牲了IE的安全性,需要進行一些設置。
步驟如圖
一、
二、
再看看ActiveX 百科解釋
“ActiveX 是一個開放的集成平台,為開發人員、 用戶和 Web生產商提供了一個快速而簡便的在 Internet 和 Intranet 創建程序集成和內容的方法。 使用 ActiveX, 可輕松方便的在 Web頁中插入 多媒體效果、 交互式對象、以及復雜程序,創建用戶體驗相當的高質量多媒體 CD-ROM”
所以可想而知,如果為了實現這個功能我們把ActiveX狀態都設置成“啟用”的后果是什么了……
語文上經常用到“前后呼應”,那么回歸到之初的問題
“如果有一個需求,要求你在BS上實現文件夾上傳操作功能?你該如何實現?”
今天是個大好日子,祝願園子里面的朋友:有情人的終成眷屬 ,沒情人的早日找到心中的情人再終成眷屬!
作者:PEPE
出處:http://pepe.cnblogs.com/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。