金喜正规买球

asp.net mvc 皮肤的探索实现

转帖|其它|编辑:郝浩|2009-03-10 10:07:19.000|阅读 1229 次

概述:asp.net mvc 皮肤的探索实现

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

在利用ASP.NET MVC 框架编写程序时,有时我们需要根据业务自己选择视图模板存放的位置,比如针对用户的设置选择不同的皮肤。如下:

我们建一个  Themes/{Channel}/{Theme}/{Controller}/ {Action} 的存放路径,视图模板还用webform。 在Url客户端的显示上,我们还遵循{Channel}/{Controller}/ {Action}规则。

实现思路是重写实现写一个ThemeViewEngine, 实现IViewEngine,作用是选择正确的WebForumView 的路径。

看下实现代码: 


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Hosting;

namespace MvcApplicationTest.ThemeEngines
{
    
/// <summary>
    
/// 皮肤选择引擎
    
/// </summary>
    public class ThemeViewEngine:IViewEngine
    {
        
         
#region IViewEngine 成员

      &nbsp; 
public ViewEngineResult FindView(ControllerContext controllerContext, 
 &nbsp;             &nbsp;  
string viewName, string masterName, bool useCache)
        {
   &nbsp;        
return _FindView(controllerContext,&nbsp;viewName, null, useCache, "aspx");
        }


     &nbsp;  
public ;ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
        {
&nbsp;  &nbsp;        
return _FindView(controllerContext, partialViewName,&nbsp;null, useCache, "ascx");
        }


    &nbsp;   
public void ReleaseView(ControllerContext controllerContext, IView view)
        {
      &nbsp;     IDisposable disposable 
= view as IDisposable;
  &nbsp;         
if (disposable != null)
                disposable.Dispose();
        }

      ;  
#endregion

    &nbsp;   
private ViewEngineResult _FindView(ControllerContext ;controllerContext, 
             &nbsp;&nbsp;   string
 viewName, string masterName, bool useCache, string ext)
        {
         &nbsp; &nbsp;
if (controllerContext == null)
           &nbsp;    
throw new ArgumentNullException("controllerContext is required.""controllerContext");
 &nbsp;           
if (string.IsNullOrEmpty(viewName))
            &nbsp;   
throw new ArgumentException("viewName is required.""viewName");


       &nbsp;    
//当前不允许在Controller中指定View的masterName
 &nbsp;       &nbsp;  if (!string.IsNullOrEmpty(masterName))
            {
         &nbsp;   &nbsp;  
throw new ArgumentException("不允许在Controller中指定View的masterName""masterName");
            }

&nbsp;           
string selectedThemeName = GetSelectedTheme(controllerContext);
    &nbsp;  &nbsp;    
string controllerName = controllerContext.RouteData.Values["controller"].ToString();
&nbsp;           
string viewPath = GetViewPath(controllerContext, selectedThemeName, controllerName, viewName, ext);
         &nbsp;  
if (viewPath == null)
             &nbsp;&nbsp; 
throw new InvalidOperationException(String.Format("The view '{0}' could not be located at these paths: {1}",
            viewName, GetChannelName(controllerContext)));

    ;&nbsp;       
return new ViewEngineResult(new WebFormView(viewPath, null), this);
        }

   &nbsp;    
#region Help Methods

   &nbsp;    
/// <summary>
        
/// 获取皮肤文件路径
   &nbsp;    
/// </summary>
        private static string GetViewPath(ControllerContext controllerContext, 
        string
 themeName, string controllerName, string viewName, string ext)
        {
            
return String.Format(@"~/Themes/{0}/{1}/{2}/{3}.{4}", GetChannelName(controllerContext), themeName, controllerName, viewName, ext); 
        }

 &nbsp;      
private static string GetChannelName(ControllerContext controllerContext)
        {
       &nbsp;    
if (controllerContext.RouteData.Values["channel"== null)
            {
   ;             
return "";
            }
          &nbsp; 
else
            {
       &nbsp;        
return controllerContext.RouteData.Values["channel"].ToString();
            }
        }

         
/// <summary>
         
/// 获取需要显示的主题名称
    &nbsp;   
/// </summary>
        private static string GetSelectedTheme(ControllerContext controllerContext)
        {
   &nbsp;        
string themeName = "Default";
      ;      
if (GetChannelName(controllerContext).ToLower() == "channel")
            {
&nbsp; &nbsp;             themeName 
= "Default";
            }
   ;         
return themeName;
        }

      &nbsp; 
#endregion

    }
}

在应用时,还需配置Global


   routes.MapRoute(
           ;    
"Channel",                 &nbsp;                    ;        // Route name
    &nbsp; &nbsp;        "{channel}/{controller}/{action}/{id}",            ;               // URL with parameters
  ;             new { channel="Channel", controller = "Home", action = "Index"
                      ;id 
= "" }  // Parameter defaults
           );

        ;    ViewEngines.Engines.Add(
new ThemeEngines.ThemeViewEngine());

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@fc6vip.cn

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP