不同项目之间的控件共享
不同項目之間的控件共享?
????? 上篇blog我有提到,不知如何解決不用項目之間的控件共享問題.很多朋友給予了熱心的回答,這里一起表示感謝.
???????總結大家的回復,一般有2種觀點,一是做成用戶控件,二是js+css的形式.確實現在這2種方法很多見,各有優點,但也各有缺點.做成用戶控件的話,如果每次修改都要發布dll的話,無疑是非常麻煩的,而js+css也是一種非常好的方法,應該很多網站目前都是使用這個方法來共享頭部和底部的.js的方法很便捷,但是也缺少一定的靈活性.因為我們不僅僅是共享頭尾而已.
????? 比如文章的列表,不同板塊的文章會呈現不用的文章和表現形式.他們只是調用的內容和排版上有所不同,而代碼方面應該是一致的.這個時候就需要做成用戶控件了.那么該如何解決這個問題呢?
????? 我們先設想一下大概思路,不同項目之間共享控件,那么控件就應該做成一個獨立的項目,而同一個控件的代碼是一樣的(就是ascx.cs是一樣的),變現不一樣(就是ascx不一樣).
肯定有朋友會想到了,我們建立多個ascx文件,讓他們都繼承自同一個ascx.cs不久可以了嗎?
?
???????
恩,沒錯,確實是這樣的思路,但是問題在于,.NET的控件只能被同一個項目所引用,因為他只支持虛擬的相對路徑.一旦跨項目引用了就出提示錯誤.(超出了當先項目虛擬目錄的根目錄了)
???????? 經過我們Google+baidu,發現.net 2.0提供了一些類來實現自己的虛擬文件系統. 這些類在System.Web.Hosting命名空間內定義.我們只要重寫VirtualPathProvider、VirtualFile就可以把ascx放在一個統一的地方,然后各個項目都可以調用了.
?????? 具體代碼如下:
??????????
Code??1public?class?SkinVirtualPathProvider?:?VirtualPathProvider
??2
??3????{
??4
??5????????/**////?<summary>
??6
??7????????///?定義模板路徑
??8
??9????????///?</summary>
?10
?11????????public?string?VirtualPath
?12
?13????????{
?14
?15????????????get;
?16
?17????????????set;
?18
?19????????}
?20
?21?
?22
?23????????/**////?<summary>
?24
?25????????///?定義擴展名
?26
?27????????///?</summary>
?28
?29????????public?string?ExtensionString
?30
?31????????{
?32
?33????????????get;
?34
?35????????????set;
?36
?37????????}
?38
?39?
?40
?41????????private?bool?CheckPathInExtension(string?virtualPath)
?42
?43????????{
?44
?45????????????return?virtualPath.EndsWith(ExtensionString);
?46
?47????????}
?48
?49?
?50
?51????????public?override?bool?FileExists(string?virtualPath)
?52
?53????????{
?54
?55????????????return?(CheckPathInExtension(virtualPath)?||?Previous.FileExists(virtualPath));
?56
?57????????}
?58
?59?
?60
?61????????public?override?VirtualFile?GetFile(string?virtualPath)
?62
?63????????{
?64
?65????????????if?(!CheckPathInExtension(virtualPath))
?66
?67????????????????return?base.GetFile(virtualPath);
?68
?69????????????else
?70
?71????????????{
?72
?73????????????????return?new?SkinVirtualFile(this,virtualPath);
?74
?75????????????}
?76
?77????????}
?78
?79?
?80
?81????????public?override?CacheDependency?GetCacheDependency(string?virtualPath,?IEnumerable?virtualPathDependencies,?DateTime?utcStart)
?82
?83????????{
?84
?85????????????if?(CheckPathInExtension(virtualPath))
?86
?87????????????????return?new?CacheDependency(this.VirtualPath?+?"/"?+?virtualPath);
?88
?89?
?90
?91????????????else
?92
?93????????????????return?base.GetCacheDependency(virtualPath,?virtualPathDependencies,?utcStart);
?94
?95????????????
?96
?97????????}
?98
?99????}
100
101?
102
103?
104
105public?class?SkinVirtualFile:VirtualFile
106
107????{
108
109????????string?path;
110
111????????private?SkinVirtualPathProvider?provider;
112
113?
114
115????????public?SkinVirtualFile(SkinVirtualPathProvider?provider,?string?virtualPath)
116
117????????????:?base(virtualPath)
118
119????????{
120
121????????????path?=?provider.VirtualPath?+?"/"?+?virtualPath;
122
123????????????this.provider?=?provider;
124
125????????}
126
127?
128
129????????public?override?Stream?Open()
130
131????????{
132
133????????????return?new?FileStream(this.path,?FileMode.Open,?FileAccess.Read,?FileShare.Read);
134
135????????}
136
137}
138
139?
140
然后在Global里注冊一下:
Code
??1public?class?SkinVirtualPathProvider?:?VirtualPathProvider
??2
??3????{
??4
??5????????/**////?<summary>
??6
??7????????///?定義模板路徑
??8
??9????????///?</summary>
?10
?11????????public?string?VirtualPath
?12
?13????????{
?14
?15????????????get;
?16
?17????????????set;
?18
?19????????}
?20
?21?
?22
?23????????/**////?<summary>
?24
?25????????///?定義擴展名
?26
?27????????///?</summary>
?28
?29????????public?string?ExtensionString
?30
?31????????{
?32
?33????????????get;
?34
?35????????????set;
?36
?37????????}
?38
?39?
?40
?41????????private?bool?CheckPathInExtension(string?virtualPath)
?42
?43????????{
?44
?45????????????return?virtualPath.EndsWith(ExtensionString);
?46
?47????????}
?48
?49?
?50
?51????????public?override?bool?FileExists(string?virtualPath)
?52
?53????????{
?54
?55????????????return?(CheckPathInExtension(virtualPath)?||?Previous.FileExists(virtualPath));
?56
?57????????}
?58
?59?
?60
?61????????public?override?VirtualFile?GetFile(string?virtualPath)
?62
?63????????{
?64
?65????????????if?(!CheckPathInExtension(virtualPath))
?66
?67????????????????return?base.GetFile(virtualPath);
?68
?69????????????else
?70
?71????????????{
?72
?73????????????????return?new?SkinVirtualFile(this,virtualPath);
?74
?75????????????}
?76
?77????????}
?78
?79?
?80
?81????????public?override?CacheDependency?GetCacheDependency(string?virtualPath,?IEnumerable?virtualPathDependencies,?DateTime?utcStart)
?82
?83????????{
?84
?85????????????if?(CheckPathInExtension(virtualPath))
?86
?87????????????????return?new?CacheDependency(this.VirtualPath?+?"/"?+?virtualPath);
?88
?89?
?90
?91????????????else
?92
?93????????????????return?base.GetCacheDependency(virtualPath,?virtualPathDependencies,?utcStart);
?94
?95????????????
?96
?97????????}
?98
?99????}
100
101?
102
103?
104
105public?class?SkinVirtualFile:VirtualFile
106
107????{
108
109????????string?path;
110
111????????private?SkinVirtualPathProvider?provider;
112
113?
114
115????????public?SkinVirtualFile(SkinVirtualPathProvider?provider,?string?virtualPath)
116
117????????????:?base(virtualPath)
118
119????????{
120
121????????????path?=?provider.VirtualPath?+?"/"?+?virtualPath;
122
123????????????this.provider?=?provider;
124
125????????}
126
127?
128
129????????public?override?Stream?Open()
130
131????????{
132
133????????????return?new?FileStream(this.path,?FileMode.Open,?FileAccess.Read,?FileShare.Read);
134
135????????}
136
137}
138
139?
140
這里擴展名我定義的.skin,這里我們也web.config里也要注冊一下
<buildProviders>
??????? <add extension=".skin" type="System.Web.Compilation.UserControlBuildProvider"/>
????? </buildProviders>
?
如此這般操作了以后,比如項目中要使用1.skin 就會去 skin目錄下去找這個文件了,不再受到虛擬目錄的根目錄的限制了.
解決這個問題之后,我們就要修改我們的用戶控件了,讓他會load這個skin里面的內容,然后來做數據的綁定.
具體代碼我就不貼了,提供幾個參考鏈接.
參考鏈接:
1.?? http://www.cnblogs.com/cricket/articles/25299.html
2.?????? http://www.cnblogs.com/zxjay/archive/2008/11/13/xianfen_net_virtualpathprovider.html
3.?????? http://blog.csdn.net/baoaya/archive/2009/07/27/4384178.aspx
?
?
??????沒啥技術含量,主要是想分享一下解決問題的方法和思路,大家見笑了
轉載于:https://www.cnblogs.com/xinzhyu/archive/2009/09/01/1558134.html
總結
以上是生活随笔為你收集整理的不同项目之间的控件共享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#实现MVC模式简要方法(2)
- 下一篇: 用openssl跟Gmail的smtp对