首先是一个站点有前台后台两部分,这个要怎么来做。可以在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 });
}

.net mvc下的Areas和小写Url的更多相关文章

  1. ASP.NET MVC:自定义 Route 生成小写 Url(转)

    先给出本文中测试用的 controller: public class PersonsController : Controller { public ActionResult Query(strin ...

  2. MVC下使用Areas

    (一) 为什么要分离 MVC项目各部分职责比较清晰,相比较ASP.NET Webform而言,MVC项目的业务逻辑和页面展现较好地分离开来,这样的做法有许多优点,比如可测试,易扩展等等.但是在实际的开 ...

  3. MVC下为什么要使用Areas

    想研究一下这个Areas,在博客园知识库找到这篇文章,先全部搬过来吧,原文地址:http://kb.cnblogs.com/page/144561/ 为什么需要分离? 我们知道MVC项目各部分职责比较 ...

  4. 一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL

    介绍 不知道大家在使用 ASP.NET MVC 时有没有一些扩展要求,反正我是有很多.在使用 MVC 这几年(PS:我是从 1.0 开始学,2.0.3.0 开发至今),我深深地觉得 MVC 的扩展性真 ...

  5. asp.net mvc 中 一种简单的 URL 重写

    asp.net mvc 中 一种简单的 URL 重写 Intro 在项目中想增加一个公告的功能,但是又不想直接用默认带的那种路由,感觉好low逼,想弄成那种伪静态化的路由 (别问我为什么不直接静态化, ...

  6. MVC下判断PC和移动端

    MVC下的PC端和移动端,其实没区别,写法都一样,只是有两点才改变了它们 第一点:就是单击这个页面任何地方的时候判断是移动端还是客户端: 第二点:新建手机端区域Areas(简单来说:Areas就相当于 ...

  7. MVC下判断用户登录和授权状态方法

    MVC下判断用户登录和授权状态方法 在我们日常开发的绝大多数系统中,都涉及到管理用户的登录和授权问题.登录功能(Authentication),针对于所有用户都开放:而授权(Authorization ...

  8. 在ASP.NET MVC中使用IIS级别的URL Rewrite

    原文 在ASP.NET MVC中使用IIS级别的URL Rewrite 大约一年半前,我在博客上写过一系列关于URL Rewrite的文章(2.3.4),把ASP.NET平台上进行URL Rewrit ...

  9. ASP.NET MVC下使用AngularJs语言(五):ng-selected

    这次学习ng-selected语法,这个是为DropDownList下拉列表显示默认选项. 演示从下面步骤开始 1,新建一个model: 上面#14行代码的property,数据类型为bool.即是存 ...

随机推荐

  1. linux下Java环境的配置

    linux下Java环境的配置 现在用linux的朋友越来越多了,前几天就有两个朋友问我linux下怎么配置java环境,我想还有很多朋友想了解学习这方面的东西,就写一个完全一点的linux java ...

  2. iOS各种类

    http://www.isenhao.com/xueke/jisuanji/bcyy/objc.php http://www.code4app.com 这网站不错,收集各种 iOS App 开发可以用 ...

  3. 【IOS学习基础】内存管理

    1.内存几大区域 1> 栈区:局部变量(基本数据类型.指针变量). 2> 堆区:程序运行的过程中动态分配的存储空间(创建的对象). 3> BSS段:没有初始化的全局变量和静态变量. ...

  4. C 各种数据类型介绍

    1.各种数据类型介绍: 基本数据类型最主要的特点是,其值不可以再分解为其它类型.也就是说,基本数据类型是自我说明的. 1.1整型 整形包括短整型.整形和长整形. 1.1.1短整形 short a=1; ...

  5. [MFC]解决回车键 ESC 默认关闭窗口的一般方法

    在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者ESC键,程序就会立刻退出,之所以会这样,是因为按下Enter键时,Windows就会自动去找输入焦点落在了哪一个按钮上, ...

  6. 使用cvReleaseImage()释放图像出错

    前几天用opencv写程序的时候,在用cvReleaseImage()函数释放cvLoadImage()加载的图像的时候出错,如下所示: IplImage *src = cvLoadImage(fil ...

  7. bootstrap之noConflict的详解

    翻开推特框架,不经发现,几乎所有的插件都会出现noConflict的写法来防止和其他的插件冲突!我们以button.js为例子,打开其源代码发现 如下: var old = $.fn.button $ ...

  8. bootstrap简章

    系统整理一遍bootstrap 的东西 1/  设置页面为H5文档类型 <!DOCTYPE html> <html lang="zh-CN"> ... &l ...

  9. nginx,wsgi,flask之间的关系

    之前看写flask 应用的一些疑问,百度上的答案解释的不错,这里记着以后可以看看Web 服务器层对于传统的客户端 - 服务器架构,客户端向服务器发送请求,服务器接收请求,处理请求,最后给客户端返回请求 ...

  10. python基础教程第2章——列表与元组笔记

    1.序列是Python中最基本的数据结构.序列中的每个元素被分配一个序列号——元素的位置,也称索引,第1个索引是0,第2为1,以此类推.序列中的最后1个元素为-1,倒数第2个位-2. python中有 ...