這一篇繼續說明附件管理共用元件 AttachFileManagerLogic 在上述功能中「儲存(更新)附件資訊與檔案、檢視附件資訊、刪除附件檔案」負責的工作。
下圖為「網站架構管理」之中網頁資料的附件設定頁 Article-Attach.aspx 畫面,
使用者透過附件設定頁操作「儲存(更新)附件資訊與檔案、檢視附件資訊」這兩項功能,
而附件設定頁網頁程式利用附件管理共用元件 AttachFileManagerLogic 來完成這兩項功能。
下列以附件設定頁的程式碼 Article-Attach.aspx.cs 說明 AttachFileManagerLogic 使用方式。
初始化:
public partial class Article_Attach : System.Web.UI.Page
{
// ...略...
protected AttachFileManagerLogic attFileMgr;
protected void Page_PreInit(object sender, EventArgs e)
{
// ...略...
attFileMgr = new AttachFileManagerLogic(this.Context);
}
protected void Page_Load(object sender, EventArgs e)
{
if (!attFileMgr.Initialize(c.qsAttId, c.qsArtId))
{
string errMsg = ResUtility.GetErrMsgOfAttFileErrState(attFileMgr.GetErrState());
Master.ShowErrorMsg(errMsg);
return;
}
// ...略...
}
Line 9: 產生 AttachFileManagerLogic 物件,為了讓元件使用 context.Server ,因此需帶入 this.Context 。
Line 14: 使用 Initialize(c.qsAttId, c.qsArtId) 初始化附件管理共用元件,帶入的兩個參數為網址參數 attid 和 artid 的值。attid 為附件代碼,編輯現有附件時使用。artid 為網頁代碼,新增附件時使用,新增附件時網址參數只會有 artid 而沒有 attid ,當網址參數沒給 attid 時,c.qsAttId 會輸出 Guid.Empty ,也就是 00000000-0000-0000-0000-000000000000 ,而附件管理共用元件以這個值來判斷是新增模式,否則就是編輯模式。
在新增附件時,這個共用元件將自動產生新的排序編號值。
在編輯附件時,這個共用元件將從資料庫取回指定附件代碼的附件資料,並且暫存在物件屬性中(參考下圖 AttachFileManagerLogic 類別圖),提供給網頁程式使用。
Line 16: 當附件管理共用元件初始化失敗時,使用 GetErrState() 可取回錯誤訊息用的列舉值,再透過 ResUtility.GetErrMsgOfAttFileErrState() 取回列舉值對應的錯誤訊息字串(依照後台系統的語系回應)。
呈現檔案資訊、檔案類型限制名單:
private void LoadExtAndMimeLimitations()
{
if (attFileMgr.FileExtLimitations != null && attFileMgr.FileExtLimitations.Count > 0)
{
string extCombined = string.Join(", ", attFileMgr.FileExtLimitations.ToArray());
ltrExtLimitations.Text = extCombined;
ExtLimitationsArea.Visible = true;
if (attFileMgr.FileMimeLimitations != null && attFileMgr.FileMimeLimitations.Count > 0)
{
string acceptList = string.Join(",", attFileMgr.FileMimeLimitations.ToArray());
fuPickedFile.Attributes.Add("accept", acceptList);
}
}
}
private void DisplayAttachFileData()
{
if (c.qsAct == ConfigFormAction.edit)
{
txtSortNo.Text = attFileMgr.SortNo.ToString();
chkDontDelete.Checked = attFileMgr.DontDelete;
ltrPostAccount.Text = attFileMgr.PostAccount;
ltrPostDate.Text = string.Format("{0:yyyy-MM-dd HH:mm:ss}", attFileMgr.PostDate);
// ...略...
ltrFileSavedName.Text = attFileMgr.FileSavedName;
// ...略...
if (attFileMgr.MdfDate.HasValue)
{
ltrMdfAccount.Text = attFileMgr.MdfAccount;
ltrMdfDate.Text = string.Format("{0:yyyy-MM-dd HH:mm:ss}", attFileMgr.MdfDate);
}
//zh-TW
if (LangManager.IsEnableEditLangZHTW())
{
txtAttSubjectZhTw.Text = attFileMgr.AttSubjectZhTw;
chkIsShowInLangZhTw.Checked = attFileMgr.IsShowInLangZhTw;
}
//en
if (LangManager.IsEnableEditLangEN())
{
txtAttSubjectEn.Text = attFileMgr.AttSubjectEn;
chkIsShowInLangEn.Checked = attFileMgr.IsShowInLangEn;
}
btnSave.Visible = true;
}
else if (c.qsAct == ConfigFormAction.add)
{
txtSortNo.Text = attFileMgr.SortNo.ToString();
btnSave.Visible = true;
}
}
Line 1~15: 將 FileExtLimitations 字串清單的內容呈現在畫面上的檔案類型限制區給使用者看。
另外 FileMimeLimitations 字串清單是用在 <input type="file"> 上傳檔案控制項的 accept 屬性中,用來自動篩選檔案類型。
Line 17~56: 將附件管理共用元件暫存在屬性中的檔案資訊呈現在畫面上。
儲存附件:
protected void btnSave_Click(object sender, EventArgs e)
{
// ...略...
try
{
// ...略...
attFileMgr.SortNo = Convert.ToInt32(txtSortNo.Text);
attFileMgr.AttSubjectZhTw = txtAttSubjectZhTw.Text;
attFileMgr.AttSubjectEn = txtAttSubjectEn.Text;
attFileMgr.IsShowInLangZhTw = chkIsShowInLangZhTw.Checked;
attFileMgr.IsShowInLangEn = chkIsShowInLangEn.Checked;
attFileMgr.DontDelete = chkDontDelete.Checked;
result = attFileMgr.SaveData(fuPickedFile, c.GetEmpAccount());
if (result)
{
ClientScript.RegisterStartupScript(this.GetType(), "", StringUtility.GetNoticeOpenerJs("Attach"), true);
}
else
{
string errMsg = ResUtility.GetErrMsgOfAttFileErrState(attFileMgr.GetErrState());
if (errMsg == "")
{
errMsg = Resources.Lang.ErrMsg_SaveFailed;
}
Master.ShowErrorMsg(errMsg);
}
// ...略...
}
catch (Exception ex)
{
c.LoggerOfUI.Error("", ex);
Master.ShowErrorMsg(ex.Message);
}
}
Line 7~14: 將使用者填寫的值更新至附件管理共用元件的屬性,再透過呼叫 SaveData(FileUpload fu, string mdfAccount) 儲存附件資訊以及實體檔案。
Line 22: 當附件管理共用元件儲存失敗時,使用 GetErrState() 可取回錯誤訊息用的列舉值,再透過 ResUtility.GetErrMsgOfAttFileErrState() 取回列舉值對應的錯誤訊息字串(依照後台系統的語系回應)。
* 完整程式碼請參考 Article-Attach.aspx.cs
下圖為「網站架構管理」之中網頁資料的附件清單畫面,
下列以網頁內容頁的程式碼 Article-Node.aspx.cs 說明當使用者按下刪除附件時, AttachFileManagerLogic 的使用方式。
刪除附件:
protected void rptAttachFiles_ItemCommand(object source, RepeaterCommandEventArgs e)
{
// ...略...
switch (e.CommandName)
{
case "Del":
// ...略...
AttachFileManagerLogic attFileMgr = new AttachFileManagerLogic(this.Context);
result = attFileMgr.Initialize(attId, c.qsArtId);
if (result)
{
result = attFileMgr.DeleteData();
// ...略...
}
if (!result)
{
string errMsg = ResUtility.GetErrMsgOfAttFileErrState(attFileMgr.GetErrState());
if (errMsg == "")
{
errMsg = Resources.Lang.ErrMsg_DeleteAttachmentFailed;
}
Master.ShowErrorMsg(errMsg);
}
break;
// ...略...
}
// ...略...
}
Line 8, 9: 初始化附件管理共用元件,attId 為刪除鈕所屬的附件資料的附件代碼。
Line 13: 初始化成功後,透過 DeleteData() 讓附件管理共用元件刪除附件資訊以及實體檔案。
Line 19: 當附件管理共用元件刪除附件失敗時,使用 GetErrState() 可取回錯誤訊息用的列舉值,再透過 ResUtility.GetErrMsgOfAttFileErrState() 取回列舉值對應的錯誤訊息字串(依照後台系統的語系回應)。
* 完整程式碼請參考 Article-Node.aspx.cs
照片管理共用元件 ArticlePictureManagerLogic 繼承 AttachFileManagerLogic ,延用附件管理的所有方法,只需改寫檔案限制類型名單、儲存的目錄位置、更換存取資料層的方法,在照片設定頁 Article-Picture.aspx 之中,其使用方式和 AttachFileManagerLogic 一模一樣。
![]() |
| 附件管理元件關聯圖 |
* 完整程式碼請參考 Article-Picture.aspx.cs






沒有留言:
張貼留言