SharePoint發(fā)行版本有SharePoint2003、SharePoint2007、Sharepoint 2010、SharePoint2013和SharePoint2016。SharePoint提供了功能強大的團隊協(xié)作環(huán)境,使得組織能夠在整個組織內(nèi)部實現(xiàn)整合、組織、查找和提供 SharePoint站點。 最近有這樣一個需求,就是要求在列表庫里管理文檔,需要多文檔管理、帶版本控制、可以單獨授權(quán)等基本操作。于是乎,就開發(fā)了一個自定義段,這里介紹一下字段的思路,里面有一些遇到的問題,在群友的幫助下已解決,特此感謝群友[悉尼]Jay,大胡子帥哥。 思路 首先簡單說一下自定義字段的思路,既然要管理文檔,就需要用到文檔庫,所以在解決方案里帶上一個文檔庫,開啟版本控制(文檔庫的xml里有這個屬性 VersioningEnabled="true"); 其次,創(chuàng)建字段,繼承自SPFieldMultiLineText,一開始想要把很多東西保存進來,選擇了繼承自多行文本類型,后來只存了關(guān)聯(lián)使用的字段的一個Guid值,所以想想單行文本或許更佳。如果你未曾創(chuàng)建過自定義字段,可以參考我博客置頂?shù)拈_發(fā)系列,里面有字段開發(fā)圖文教程; 再次,創(chuàng)建BaseFieldControl類,同時創(chuàng)建前臺展示控件,也就是ascx控件,里面有顯示模板、編輯模板、JavaScript和Ajax等; 然后,創(chuàng)建應(yīng)用程序頁面,用來上傳和刪除文檔,也就是管理文檔,里面用到了SPGridView控件,然后里面還有版本控制頁面,因為自己犯懶,所以版本控制用了SharePoint自帶的Version.aspx頁面,后來也遇到了一些問題; 最后,以上基本上是大致思路,可能這樣貿(mào)然看起來比較糾結(jié),下面讓我們用圖片形象化一下下,Let’s Go! 圖解 其間部署,激活網(wǎng)站Feature等略過,我們只描述相對重要的部分;在我們的列表里添加字段(因為我們開發(fā)的就是字段么),選擇部署好的字段,如果部署成功但是沒有,試著重啟一下IIS,或者回收應(yīng)用程序池,如下圖: 然后,點擊新建項目,我們的字段已經(jīng)創(chuàng)建成功,點擊Edit Attachments可以進入管理頁面,當(dāng)然這個詞還是我隨便起的,因為我也沒想好叫什么,等著Manger們提意見了,如下圖: 進入管理頁面,這里用的是SharePoint自己的模態(tài)窗口,當(dāng)然寬度和長度是我自己猜想的,汗!里面的頁面就是我定義的應(yīng)用程序頁,也就是上傳控件+SPGridView控件展示,用了模態(tài)窗口的dialogReturnValueCallback屬性,在關(guān)閉模態(tài)窗口的時候,刷新編輯頁面的值顯示; 上傳功能就很簡單了,就是上傳控件+Button,沒什么可說的,后臺服務(wù)器端對象模型,OverWrite上傳,然后重名會產(chǎn)生版本;下面是顯示的圖,我上傳了幾個文檔,如下圖: 這里面也沒有什么復(fù)雜的東西,就是下載(Link的文檔的鏈接),刪除(delete執(zhí)行一個JavaScript方法,傳進去該項目的ID,然后js Call一個后臺方法,根據(jù)這個Id刪除,然后刷新),版本控制(Link到版本控制頁面,另一個根據(jù)SharePoint自帶version.aspx改造的); 其實關(guān)于Delete自己想說一點,不知道自己用的方法是不是很好,就是在SPGridView生產(chǎn)html的時候,格式化成腳本,如下圖: 然后用腳本去Call后臺方法把這個Id=16的項目delete掉,如果大家有更好的方法,期待留言給我! 然后是版本控制頁面,前面也已經(jīng)說了,這里是根據(jù)SharePoint自帶的/_layouts/15/version.aspx改造的,然后隱藏了左側(cè)導(dǎo)航、Ribbon等不想干的東西,拼成Link顯示的,如下圖: 說說link的大致結(jié)構(gòu),也是參考version.aspx拼的,首先就是頁面地址,然后list的guid,然后是這個項目的ID,然后是這個文件的文件名,最后是我定義的返回鏈接,也就是上面Go back Attachment Lists按鈕返回的地址; 1 /_layouts/15/SharePoint.AttachmentWithVersion/Versions.aspx?2 list={9d0234b8-23c4-4f4f-bc5a-f21908aaba79}&3 ID=16&4 FileName=1.png&5 SourceUrl=/sites/JianYu/SubDemo/_layouts/15/PwC.SharePoint.AttachmentWithVersion/UpLoadPwCAttachments.aspx?AttachmentsId=8638db30-133f-489e-8139-4abd36b0785f 著重說一下這個頁面的改造,我想對于SharePoint后續(xù)開發(fā)還是有幫助的,其實自己也是因為偷懶給自己挖了一個坑;不貧了,進入正題! 其實這個頁面很好用,改了改樣式,隱藏掉一些不需要的東西,加一個返回按鈕,已經(jīng)成型了;就在自己興高采烈的時候,發(fā)現(xiàn)了問題,所有功能都沒問題,正常運行,但是發(fā)現(xiàn)Delete All Versions、Restore、Delete幾個功能,執(zhí)行完畢以后,返回默認(rèn)的version.aspx頁面,而不是我這個自定義的頁面,這下慌了; 自己首先想到JavaScript的問題,然后根據(jù)F12Debug發(fā)現(xiàn)了core.js的問題,然后custom一個core.js給這個頁面引用,進行修改(千萬不要改默認(rèn),有可能印象默認(rèn)功能,也有可能打補丁被覆蓋!),自己研究了半天core.js無解,然后就是大胡子帥哥Jay發(fā)了我一個Link,然后恍然大悟; 執(zhí)行過程是這樣的,通過core.js里面的腳本,然后傳參去call 默認(rèn)的version.aspx,然后進行后臺處理后展示,大致思路是這樣的,后臺自己反編譯了Microsoft.SharePoint.ApplicationPages.VersionsPage文件,發(fā)現(xiàn)確實是傳參和后臺處理有問題,然后找到了解決辦法! 找到Restore的腳本,在core.js(默認(rèn)layouts下面)中,我使用了格式化工具,格式化成正常格式,如下圖: 經(jīng)過分析發(fā)現(xiàn)就是SubmitFormPost(b)中參數(shù)b的問題,默認(rèn)是下面格式,提交到versions.aspx進行處理,然后展示,所以一定會回到默認(rèn)頁面展示了,所以我首先替換了這個地址為自己定義version.aspx的地址; /_layouts/15/versions.aspx?FileName=banner%2Ejpg&list={4059c14d-b1ee-4216-828d-429ef5271d52}&ID=10&col=Number&order=d&op=Restore&ver=512 然后發(fā)現(xiàn),所有問題,都是由內(nèi)部方法public string SortUrl(string col, string order)引起的,它在處理完所有請求以后,跳轉(zhuǎn)到了一個地址,這個地址是根據(jù)默認(rèn)Layouts目錄產(chǎn)生的,汗! 然后我在后臺找到了Restore方法,發(fā)現(xiàn)是在最后一行this.RefreshWithoutOp();中跳轉(zhuǎn)的; RefreshWithoutOp()方法,就這樣結(jié)合core.js和反編譯工具,整理清楚了運行的整個過程,然后就是解決問題了,到這里,其實已經(jīng)折騰快2天了,糾結(jié)啊! 研究通過程以后,又反過來看core.js,發(fā)現(xiàn)了前臺js如何去call這個方法,也就是之前說的參數(shù)b的問題了,下面一行就是我修改以后的參數(shù)b,替換了處理頁面(a.HttpPath),op就是傳參進來的后臺方法,itemTable.getAttribute是當(dāng)前項目的信息; var b = a.HttpPath.replace("_layouts/15/versions.aspx", "_layouts/15/SharePoint.AttachmentWithVersion/versions.aspx") + "&op=CustomRestore&ver=" + itemTable.getAttribute("verId"); 至此,找到了解決思路,也就是吧op傳進來的方法Restore改成CustomRestore,在我自定義的version.aspx頁面的前臺重新定義CustomRestore方法; 修改調(diào)用的this.RefreshWithoutOp();為this.CustomRefreshWithoutOp();然后在前臺添加CustomRefreshWithoutOp方法;然后依次定義public string SortUrl()和public string SortUrl(string col, string order)方法,修改builder.Append("SharePoint.AttachmentWithVersion/versions.aspx");這樣,完成后就會跳轉(zhuǎn)到我們自定義的version.aspx頁面了,艾瑪,終于完成了! 再有就是關(guān)閉這個管理頁面的時候,如何同步新建頁面/修改頁面的字段值的問題,這里,我用了關(guān)閉事件,去Call一段Ajax更新這個值,感覺很笨,但是也是沒辦法的事兒,哎! 后來又遇到問題,在自定義母版頁中,關(guān)閉的時候Call事件不好用,不知道為什么,也沒有任何debug error,所以又在編輯控件上加了每隔3s刷新,如果call失敗了,就每隔3sCall一次,現(xiàn)在還不太清楚是否對于性能有太大影響,哎~ 以上基本上是開發(fā)思路和展示,還有遇到的一些問題,當(dāng)然思路有點凌亂,確實是,開發(fā)過程雖然自己有一個小小的設(shè)計,但是依舊感覺凌亂;好吧,后期還待優(yōu)化,下面看看Dispform頁和Allitems頁的展示吧! Allitems頁面的展示,public override string GetFieldValueAsHtml(object value)字段里的這個方法做的展示,沒什么特別要說的,呵呵; Dispform頁的展示,如下圖: 下面,介紹一下解決方案的文件結(jié)構(gòu),如下圖: Sharepoint 可以幫助企業(yè)用戶輕松完成日常工作。 |
溫馨提示:喜歡本站的話,請收藏一下本站!