.NEt专家博客!

【Q.Lee.lulu】ASP.NET MVC: 修改ViewLocator来动态切换模板

上一篇 / 下一篇  2008-07-22 10:18:20 / 个人分类:WEB开发

动态切换view来换主题ITPUB个人空间}Bde#t8I"Pt6~X
[views]ITPUB个人空间6k+wIK hj
.|ITPUB个人空间7tJ)jYy;{_T%E#f
.---[Controler1]ITPUB个人空间V9[ P ^d
...|
k(Hu&`,W]"F#H1S3o0...---[blue]ITPUB个人空间_/A0Sv/_x&j&gZ%f+p
.... |ITPUB个人空间} }5?PRY o(Pe
.... ---index.aspx
9`VF S] K+w#R0.... |
)NHa(Om9U;G ^0.... ---Edit.aspxITPUB个人空间/z_!F!DPh/g
...---[Red]ITPUB个人空间nv3Z0g'f\J
.... |ITPUB个人空间&D(Dj;P V/Z M.R
.... ---index.aspxITPUB个人空间byM6Bu ^8fIn
.... |ITPUB个人空间ui2`3j,Eh t
.... ---Edit.aspx
+_^ m'tc,ulHJ#y0.---[Controler2]ITPUB个人空间_IRd7?^7dkU/Z
...|ITPUB个人空间(wDD2b*K'{:v
...---[blue]
[y9qKYZ[.}0.... |
3C~ME$k7p*}wn0.... ---hello.aspxITPUB个人空间X&P6?[^6U c'|5~
.... |ITPUB个人空间G2h#[$jb2^~
.... ---report.aspxITPUB个人空间*G2X0@7^b9@"c
...---[Red]
L{m9m$}O0.... |ITPUB个人空间vy8^ BT_p#rP nmn]
.... ---hello.aspx
)v]:S7N/_9|;p0.... |
4U-S:jEQ [&~!A0.... ---report.aspxITPUB个人空间)A;}\c!eg? v{
这样,主题view无法独立出来,不利于分离主题,管理主题。ITPUB个人空间4CM2U#\)x"t*N
而我觉得,最理想的结构是ITPUB个人空间-?v!G[Cc9}
[views]ITPUB个人空间K v nxy%q1z
.|
's\/WBX0.---[blue]ITPUB个人空间woB QHx'U6T1^5yY
...|ITPUB个人空间8|6N$u!OlF
...---[Controler1]ITPUB个人空间'^*awV E
.... |ITPUB个人空间6T'C*UV{\P0@2DG
.... ---index.aspx
^md.~7a0.... |
f c'`C'K0.... ---Edit.aspxITPUB个人空间 Y3\ z;o%_
...---[Controler2]ITPUB个人空间5P*P6iBZ
.... |
M6TV6|5i`0.... ---hello.aspx
;l]X]$KGM0.... |ITPUB个人空间$?}9Fi ?wSt
.... ---report.aspx
X|3v ]0X!S3s0.---[Red]ITPUB个人空间j5yPz.P;z-xp"x
...|
e5BH#JY5L5Z0...---[Controler1]
-~A3X&v*cm0.... |
d)v_ fb Y@ Uik,f B0.... ---index.aspxITPUB个人空间si7S@2CU4To'r
.... |
hz%]8S-e2I4[8@M0.... ---Edit.aspx
o1|vG F B,b0...---[Controler2]ITPUB个人空间Kh-Hl`QGC
.... |ITPUB个人空间~(F mr&y
.... ---hello.aspx
Y7oz5B6?0.... |
s [ K D'@'j kn0.... ---report.aspx
jzyI4@8Z0但是如果用这种,默认的模板路径是不支持的。ITPUB个人空间fW.y3Y4@
看了你的文章恍然大悟。ITPUB个人空间{|8RlLIQ
改一下ViewLocator的逻辑就可以了对吧。

在这里简单给大家说下如何实现,只要给大家提供一点思路。其实把框架研究透彻了,真的很多问题都迎刃而解。

大家如果有看过我的上篇文章ASP.NET MVC : 实现我们自己的视图引擎,其实就明白的了。

在这里,首先我们需要一个配置文件来配置站点要使用的模板(主题)。

Config/Site.config :

<?xml version="1.0" encoding="utf-8"?><site><appsettingViewTheme="Default"/></site>

 

然后修改默认的ViewLocator  :

public class uLinkViewLocator : ViewLocator
Oi|3l6v%O0    
{ITPUB个人空间;\+{P?.E
        
public uLinkViewLocator()ITPUB个人空间]^j5E(y
        
{
*q(H)sBw2n]!qq3M7r.g0            
base.ViewLocationFormats = new string[] { BaseviewPath + "/{1}/{0}.aspx",ITPUB个人空间Z!Q.m@k h/R
                                                      BaseviewPath 
+ "/{1}/{0}.aspx",ITPUB个人空间 L3e%iuFY$|g%N
                                                      BaseviewPath 
+ "/Shared/{0}.aspx",
| miS+A#x0                                                      BaseviewPath 
+ "/Shared/{0}.aspx",
Y5ZPl_4CK5U0                                                      
"~/Views/{1}/{0}.aspx",
7V HeI#^Xn0                                                      
"~/Views/{1}/{0}.aspx",ITPUB个人空间W6n2L6I0L#HV
                                                      
"~/Views/Shared/{0}.aspx",
4~+vX/SEDH0                                                      
"~/Views/Shared/{0}.aspx"ITPUB个人空间*_7A E:X8aP*}'i#Mfr
            }
;

F.``UX'sK i3dp0        }
ITPUB个人空间 Ep`5k^zl:W
ITPUB个人空间c z+V;ID.s!gaH
        
private string _baseviewPath;
.SDx^6lE!Vp0        
private string BaseviewPathITPUB个人空间)[7}t2u ?9E4|M'w
        
{ITPUB个人空间+^)NAY}2}Ud3Q4K s
            
get
{g3O#W%~ a0            
{
dzk3rr+e0                
if (string.IsNullOrEmpty(_baseviewPath))ITPUB个人空间'Y]A^POz7|y
                
{
/z o%C4VeB)c1}6k8W5^0                    
string viewTheme = ConfigXml.Element("appsetting").Attribute("ViewTheme").Value;
c+@~!nj z{,B0                    viewTheme 
= string.IsNullOrEmpty(viewTheme) ? "Default" : viewTheme;
4}G\'W7cHK0                    _baseviewPath = "~/Views/" + viewTheme;
} Ntefm8j0
                }
ITPUB个人空间Nk(Ip1{k%z"h
                
return _baseviewPath;ITPUB个人空间}P6L-IVe;q9c:v#`?
            }

M'o/A Fz.[Y.E/^0        }

S Q3F#h&r2V1vI"[o0
FI'~xTWr'e0        
private XElement configXml;
~ F2Mp ?0        
private string path = System.Web.HttpRuntime.AppDomainAppPath + "/Config/Site.config";
MEy|v0        
/// <summary>
$}/R2rf.k+q!S0        
/// 加载XML文件
`:l*J U!p4W0        
/// </summary>

G M+AM4`r;]/L0        private XElement ConfigXml
!kkO$?1Z"b0        
{ITPUB个人空间P i:C+{-PX
            
getITPUB个人空间p2g.H[[
            
{
7vd|_&OF4l0                
if (configXml == null)
vuYo mv0                
{
g6o)D X ?d8U2I0                    configXml 
= XElement.Load(path);
~A'p U i{0                }
ITPUB个人空间e-j2Ehffr5as ?
                
return configXml;
nU:T^?TOg0            }

Rc0R |jf}E0        }

E*Q1`ve0    }
 

还有修改ViewEngine的ViewLocator 为刚才创建的uLinkViewLocator :

public class uLinkViewEngine : WebFormViewEngine
c)W'S'M"O0    
{
3^u(dt_/SF0
+gOI+tW L3G2R0        IViewLocator _viewLocator 
= null;
o0WDFA4p}0ITPUB个人空间I2uD%I7JTK
        
protected override void RenderView(ViewContext viewContext)
m`&q)Y(_-B] x0        
{
Lsz3ZQQ0            
base.ViewLocator = this.ViewLocator;ITPUB个人空间:[,|6`PT$c8T
            base.RenderView(viewContext);
4^,S"y}-`0        }
ITPUB个人空间"|7\y|o sZ

4Q4H/Y3Y;@OXQ0UC k0        
public IViewLocator ViewLocator
*GbEAX0Om.A8S0        
{
Eg)OY,M$Up_@I0            
getITPUB个人空间-O$sa2qg1h?.{&|q%t,t
            
{
Se,O)I'd/B7n;S0                
if (this._viewLocator == null)ITPUB个人空间.Cs yv9N"X,L
                
{ITPUB个人空间/hQ9z,o%})B Y d
                    
this._viewLocator = new uLinkViewLocator();
FGXC M Y0                }

~l"j)fVN)}(k0                
return this._viewLocator;ITPUB个人空间mE)|#M!p9\
            }

mHmT\WZ0            
setITPUB个人空间m%fPcg3M(Y
            
{ITPUB个人空间V1}1Qg4|Fb
                
this._viewLocator = value;ITPUB个人空间 p c,p,k Mc8MI4F
            }

;Y bV.p ~OV0        }

1{"`~p8Ea-z%` d0    }
 

然后创建一个ControllerFactory继承自默认的DefaultControllerFactory,以修改默认的controller中的ViewEngine为我们创建的uLinkViewEngine :

public class uLinkControllerFactory : DefaultControllerFactory
|1qk:g$dV,RM4`(_?0    
{
G#mb*N"g,]H0        
protected override IController CreateController(RequestContext requestContext, string controllerName)ITPUB个人空间&]*G)P!AK@9n |5k
        
{ITPUB个人空间M v)r2n\
            Controller controller 
= (Controller)base.CreateController(requestContext, controllerName);
(hgl$J%dn'K4R0            controller.ViewEngine = new uLinkViewEngine();
//修改默认的视图引擎为我们刚才创建的视图引擎ITPUB个人空间{2Dj GO9o
            return controller;
3Ty.}V'WG1D ? o0        }

k2P"\:w5Rb0ITPUB个人空间M#x*]|t:J Q$c
    }

在Global.asax.cs中的Application_Start 事件中注册我们的 uLinkControllerFactory :

ControllerBuilder.Current.SetControllerFactory(typeof(uLinkControllerFactory));
然后在写一个设置模板的Controller:
ThemeController

TAG: 微软

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-12-05  
 123456
78910111213
14151617181920
21222324252627
28293031   

数据统计

  • 访问量: 67609
  • 日志数: 1924
  • 影音数: 7
  • 文件数: 1
  • 建立时间: 2008-01-04
  • 更新时间: 2008-12-05

RSS订阅

Open Toolbar