• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

为ASP.NETMVC1.0添加Areas

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

       今天闲逛时看到MVC 2.0的一些新特性,其中一样就是:提供域划分功能(Areas)。MVC 1.0刚发布的时候,我就为这个东西纠结过一段时间,后来在老外的Blog上看到了一个简单的解决方案,一直都在用,现整理出来,给有需要的同学做个参考。
      园子里对这个功能关注的人好象不是很多,所以对此功能稍做一下解释。域划分简单的说就是按功能来划分模块。如用户模块(User)及文章模块(Article),每个模块都有好几个Controller,也许我们需要把模块分别放在独立的命名空间下。在Url上,模块划分体现为:/{Area}/{Controller}/{Action}。(可能我说的不大清楚,尚不明白的请自行到网上搜索)
以下为步骤:
1.把Controller按模块分类。

2.为模块设计路由

3.更换模板引擎(见上图)

4.将视图移至Area文件夹(路径为/{Area}/{Controller}/{Action})


以下为实现
1.为路由添加area

代码
using System.Web.Routing;

namespace Madnet.DevMvc
{
    
public static class RouteHelper
    {
        
public static void CreateArea(this RouteCollection routes, string areaName, string[] controllersNamespace, params Route[] routeEntries)
        {
            
foreach (var route in routeEntries)
            {
                
if (route.Constraints == null) route.Constraints = new RouteValueDictionary();
                
if (route.Defaults == null) route.Defaults = new RouteValueDictionary();
                
if (route.DataTokens == null) route.DataTokens = new RouteValueDictionary();

                route.Constraints.Add(
"area", areaName);
                route.Defaults.Add(
"area", areaName);
                route.DataTokens.Add(
"namespaces", controllersNamespace);

                
if (!routes.Contains(route)) // To support "new Route()" in addition to "routes.MapRoute()"
                    routes.Add(route);
            }
        }
    }
}

 

2.改造模板引擎,以满足基于area的模板路径搜索

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;

namespace Madnet.DevMvc
{
    
public class DefaultViewEngine: WebFormViewEngine
    {
        
public DefaultViewEngine()
            : 
base()
        {
            ViewLocationFormats 
= new[] { 
                
"~/{0}.aspx",
                
"~/{0}.ascx",
                
"~/Views/{1}/{0}.aspx",
                
"~/Views/{1}/{0}.ascx",
                
"~/Views/Shared/{0}.aspx",
                
"~/Views/Shared/{0}.ascx",
            };

            MasterLocationFormats 
= new[] {
                
"~/{0}.master",
                
"~/Shared/{0}.master",
                
"~/Views/{1}/{0}.master",
                
"~/Views/Shared/{0}.master",
            };

            PartialViewLocationFormats 
= ViewLocationFormats;
        }
        
#region IViewEngine Members
        
public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache) {
            
            ViewEngineResult areaResult 
= null;
            
            
if (controllerContext.RouteData.Values.ContainsKey("area")) {
                
string areaPartialName = FormatViewName(controllerContext, partialViewName);
                areaResult 
= base.FindPartialView(controllerContext, areaPartialName, useCache);
                
if (areaResult != null && areaResult.View != null) {
                    
return areaResult;
                }
                
string sharedAreaPartialName = FormatSharedViewName(controllerContext, partialViewName);
                areaResult 
= base.FindPartialView(controllerContext, sharedAreaPartialName, useCache);
                
if (areaResult != null && areaResult.View != null) {
                    
return areaResult;
                }
            }

            
return base.FindPartialView(controllerContext, partialViewName, useCache);
        }

        
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) {
            ViewEngineResult areaResult 
= null;

            
if (controllerContext.RouteData.Values.ContainsKey("area")) {
                
string areaViewName = FormatViewName(controllerContext, viewName);
                
string masterAreaViewName = FormatMasterViewName(controllerContext, masterName);
                areaResult 
= base.FindView(controllerContext, areaViewName, masterAreaViewName, useCache);
                
if (areaResult != null && areaResult.View != null)
                {
                    
return areaResult;
                }

                areaResult 
= base.FindView(controllerContext, areaViewName, masterName, useCache);
                
if (areaResult != null && areaResult.View != null) {
                    
return areaResult;
                }

                
string sharedAreaViewName = FormatSharedViewName(controllerContext, viewName);
                areaResult 
= base.FindView(controllerContext, sharedAreaViewName, masterAreaViewName, useCache);
                
if (areaResult != null && areaResult.View != null)
                {
                    
return areaResult;
                }
                areaResult 
= base.FindView(controllerContext, sharedAreaViewName, masterName, useCache);
                
if (areaResult != null && areaResult.View != null) {
                    
return areaResult;
                }
            }

            
return base.FindView(controllerContext, viewName, masterName, useCache);
        }
        
#endregion IViewEngine Members
        
private static string FormatViewName(ControllerContext controllerContext, string viewName)
        {
            
string controllerName = controllerContext.RouteData.GetRequiredString("controller");
            
string area = controllerContext.RouteData.Values["area"].ToString();
            
return "Views/" + (string.IsNullOrEmpty(area) ? "" : (area + "/")) + "/" + controllerName + "/" + viewName;
        }

        
private static string FormatSharedViewName(ControllerContext controllerContext, string viewName)
        {
            
string area = controllerContext.RouteData.Values["area"].ToString();
            
return "Views/" + (string.IsNullOrEmpty(area) ? "" : (area + "/")) + "/Shared/" + viewName;
        }
        
private static string FormatMasterViewName(ControllerContext controllerContext, string masterName)
        {
            
string area = controllerContext.RouteData.Values["area"].ToString();
            
return "Views/" + (string.IsNullOrEmpty(area) ? "" : (area + "/")) + "/Masters/" + masterName;
        }
    }
}

 --------------------------------------
http://www.qwolf.com/

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
asp.netwebapi参数发布时间:2022-07-10
下一篇:
ASP.NET缓存--概述发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap