.netmvc下的Areas和小写Url

首先是一个站点有前台后台两部分,这个要怎么来做。可以在mvc项目中添加区域(Areas)来实现,当添加一个名为Admin的区域时,项目下多了一个Areas/Admin目录,里边有Controllers、Models、Views这个我人个觉得目录太深维护操作不便。关于前台和后台的模块分离可以参考园子里的<<使用Areas分离ASP.NET MVC项目>> http://kb.cnblogs.com/page/144561/这篇文章。

然后就是Url小写的问题,后台的Url一般没什么要求,前台那部分一般都是要求要小写的,Controller和Action正常都是首字母大,然后生成出来的Url那部分也是大写的,一个个的在路由里定义不太现实,调用生成Url时小写Controller和Action看起来也很奇怪的,像Url.Action(“Details”,"Product”)写成Url.Action(“details”,"product”)。园子里也有一篇ASP.NET MVC:自定义Route生成小写Url,因为分离了项目,映射路由有些问题,要使用带NameSpace参数的MapRoute。用.NET Reflector看了一下 RouteCollectionExtensions 里的对应方法源码,它的实现方式如下:

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces)
{
    if (routes == null)
    {
        throw new ArgumentNullException("routes");
    }
    if (url == null)
    {
        throw new ArgumentNullException("url");
    }
    Route route2 = new Route(url, new MvcRouteHandler()) {
        Defaults = CreateRouteValueDictionary(defaults),
        Constraints = CreateRouteValueDictionary(constraints),
        DataTokens = new RouteValueDictionary()
    };
    Route item = route2;
    if ((namespaces != null) && (namespaces.Length > 0))
    {
        item.DataTokens["Namespaces"] = namespaces;
    }
    routes.Add(name, item);
    return item;
}

自定义路由的代码

public class LowerCaseUrlRoute : Route
    {
        /// <summary>
        /// 需要小写的键值
        /// </summary>
        private static readonly string[] RequiredKeys = new[] { "controller", "action" };

        #region 实现继承类的构造
        public LowerCaseUrlRoute(string url, IRouteHandler routeHandler)
            : base(url, routeHandler)
        {
        }

        public LowerCaseUrlRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
            : base(url, defaults, routeHandler)
        {
        }

        public LowerCaseUrlRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler)
            : base(url, defaults, constraints, routeHandler)
        {
        }

        public LowerCaseUrlRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler routeHandler)
            : base(url, defaults, constraints, dataTokens, routeHandler)
        {
        }
        #endregion
        /// <summary>
        /// 重写GetVirtualPath以生成小写Url
        /// </summary>
        /// <param name="requestContext"></param>
        /// <param name="values"></param>
        /// <returns></returns>
        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
        {
            LowerRouteValues(requestContext.RouteData.Values);
            LowerRouteValues(values);
            LowerRouteValues(Defaults);
            return base.GetVirtualPath(requestContext, values);
        }

        /// <summary>
        /// 转换要小写的键值
        /// </summary>
        /// <param name="values"></param>
        private void LowerRouteValues(RouteValueDictionary values)
        {
            foreach (var key in RequiredKeys)
            {
                var value = values[key];
                values[key] = value.ToString().ToLower();
            }
        }
    }

    public static class LowerCaseUrlRouteExtensions
    {
        /// <summary>
        /// LowerCaseUrlRouter的扩展方法
        /// </summary>
        /// <param name="routes"></param>
        /// <param name="name"></param>
        /// <param name="url"></param>
        /// <param name="defaults"></param>
        /// <returns></returns>
        public static LowerCaseUrlRoute MapUrl(this RouteCollection routes, string name, string url, object defaults)
        {
            var route = new LowerCaseUrlRoute(url,
                new RouteValueDictionary(defaults),
                new RouteValueDictionary(), //constraints
                new RouteValueDictionary(), //dataTokens
                new MvcRouteHandler());
            //获取当前项目控制器的Namespace,使其默认应用在这个Namespace下
            var type = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType;
            if (type != null)
            {
                var namespaces = new[] { type.Namespace + ".Controllers" };
                route.DataTokens["Namespaces"] = namespaces;
            }
            routes.Add(name, route);
            return route;
        }

        public static LowerCaseUrlRoute MapUrl(this RouteCollection routes, string name, string url, object defaults, string[] namespaces)
        {
            var route = new LowerCaseUrlRoute(url,
                new RouteValueDictionary(defaults),
                new RouteValueDictionary(), //constraints
                new RouteValueDictionary(), //dataTokens
                new MvcRouteHandler());

            if ((namespaces != null) && (namespaces.Length > 0))
            {
                route.DataTokens["Namespaces"] = namespaces;
            }
            routes.Add(name, route);
            return route;
        }
    }

在Global.asax中的使用如下:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapUrl("home", "", new { controller = "Home", action = "Index" });
            routes.MapUrl("index", "{controller}.html", new { controller = "Villa", action = "Index" });
            routes.MapUrl("details", "{controller}/{id}.html", new { controller = "Villa", action = "details" });
            routes.MapUrl("default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
        }
更多相关文章
  •     还是下面那个故障的用户,点击IE地址栏下拉网址中的URL提示"文件名.目录名或卷标名不正确".手动输入网址可以打开.    百度了一下解决方法:在"运行"对话框中输入cmd 确定,把下面一段一段复制进去,每复制一段回车一下,保证每段都能顺利执行(注册表 ...
  • 日常开发的绝大多数系统中,都涉及到管理用户的登录和授权问题.登录功能(Authentication),针对于所有用户都开放:而授权(Authorization),则对于某种用户角色才开放. 在asp.net mvc中,微软虽然已经帮助开发者构建了ASP.NET Identity这样强大的验证授权框架 ...
  • 如果我们在Global中的Application_Start事件中访问HttpContext.Current.Request对象,如: protected void Application_Start() { var url=HttpContext.Current.Request.Url.ToStr ...
  • 在MVC下,不能和ASP.NET一样通过Response.Write(""); 来跳出提示框,但是可以用return content()来显示所需要的提示.return Content(@"); 或者使用先定义提示参数和跳转页面来操作,这样更简单:var A=strin ...
  • 如果url是 /home/index?id=3 直接Request就ok. 但是如果路由设定为:{controller}/{action}/{id}  url是 /home/index/3   这时想在页面View中获取参数id的值,该怎么获取? 查了下资料好多人都利用Action获取到参数值后,用 ...
  • ASP.NETMVC下的四种验证编程方式续篇
    在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注ValidationAttribute特性"."让数据类型实现IValidatableObject或 ...
  • ASP.NETMVC下的四种验证编程方式
    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定.总地来说,我们可以采用4种不同的编程模式来进行针对绑定参数的验证. 目录 一.手工验证绑定的参数 ...
  • 参考:http://stackoverflow.com/questions/28169365/font-wont-get-found-on-server-for-firefox#         http://blog.csdn.net/lujianfeiccie2009/article/detai ...
一周排行
  •   在linux环境下使用sqlplus,在回删(backspace)时往往会出现 一串的乱码.出现乱码是由于oracle的sqlplus不使用gnu的readline库造成的.   解决方法有两种: 1.要使用回删 ...
  • Android学习笔记--JNI的使用方法
    1.JNI是什么 JNI是Java Native Interface的缩写,它提供若干的A ...
  • from: http://www.cnblogs.com/code/articles/4103070.html增强参数(Enforcing Options)本类参数设为true,JSHint会产生更多告警.bitwi ...
  • 移动代理服务器(MAS)系统简介移动电子政务和移动电子商务的应用需求在快速增长,中国移动为适应行业集团客户对信息化移动应用不断增长的需求,推出 MAS(移动代理服务器 Mobile Agent Server)系统,解 ...
  • 对于企业和政府机构来说,未来一年将是其就技术系统的发展方向做出重大决策的重要之年.社交媒体的兴起.对移动服务需求的增长,以及大数据的增长已经使得IT不再只是办公和协作的重要工具.它已经成了为消费者.公众和员工提供新服 ...
  • 一周读书Alllifeisproblemsolving
    书籍:<开放的智力> 采铜是我在知乎关注最早的大V之一,那时我脑里有一大堆疑惑 ...
  • 1 备份所以数据库mysqldump -uroot -p --all-database > all.sql2 备份数据库testmysqldump -uroot -p test > test.sql3 备 ...
  •        在Android系统中,同一时刻只有一个Activity组件是处于激活状态的,因此,当ActivityManagerService服务激活了一个新的Activity组件时,它就需要通知WindowMan ...
  • 在笔记本上先装了ubuntu,用grub2启动,近来又装了个centos,grub启动还是用ubuntu上的,重启报错 switchroot: mount failed: No such file or direct ...
  • 今天看了任正非就华为员工抑郁自杀事件写的内部邮件 "要快乐的度过充满困难的一生"!其中一段话摘录下来,太有才了!大家来共勉...      员工不必为自己的弱点而太多的忧虑,而是要大大地发挥自己的 ...