.net mvc下的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 });
}
.net mvc下的Areas和小写Url的更多相关文章
- ASP.NET MVC:自定义 Route 生成小写 Url(转)
先给出本文中测试用的 controller: public class PersonsController : Controller { public ActionResult Query(strin ...
- MVC下使用Areas
(一) 为什么要分离 MVC项目各部分职责比较清晰,相比较ASP.NET Webform而言,MVC项目的业务逻辑和页面展现较好地分离开来,这样的做法有许多优点,比如可测试,易扩展等等.但是在实际的开 ...
- MVC下为什么要使用Areas
想研究一下这个Areas,在博客园知识库找到这篇文章,先全部搬过来吧,原文地址:http://kb.cnblogs.com/page/144561/ 为什么需要分离? 我们知道MVC项目各部分职责比较 ...
- 一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL
介绍 不知道大家在使用 ASP.NET MVC 时有没有一些扩展要求,反正我是有很多.在使用 MVC 这几年(PS:我是从 1.0 开始学,2.0.3.0 开发至今),我深深地觉得 MVC 的扩展性真 ...
- asp.net mvc 中 一种简单的 URL 重写
asp.net mvc 中 一种简单的 URL 重写 Intro 在项目中想增加一个公告的功能,但是又不想直接用默认带的那种路由,感觉好low逼,想弄成那种伪静态化的路由 (别问我为什么不直接静态化, ...
- MVC下判断PC和移动端
MVC下的PC端和移动端,其实没区别,写法都一样,只是有两点才改变了它们 第一点:就是单击这个页面任何地方的时候判断是移动端还是客户端: 第二点:新建手机端区域Areas(简单来说:Areas就相当于 ...
- MVC下判断用户登录和授权状态方法
MVC下判断用户登录和授权状态方法 在我们日常开发的绝大多数系统中,都涉及到管理用户的登录和授权问题.登录功能(Authentication),针对于所有用户都开放:而授权(Authorization ...
- 在ASP.NET MVC中使用IIS级别的URL Rewrite
原文 在ASP.NET MVC中使用IIS级别的URL Rewrite 大约一年半前,我在博客上写过一系列关于URL Rewrite的文章(2.3.4),把ASP.NET平台上进行URL Rewrit ...
- ASP.NET MVC下使用AngularJs语言(五):ng-selected
这次学习ng-selected语法,这个是为DropDownList下拉列表显示默认选项. 演示从下面步骤开始 1,新建一个model: 上面#14行代码的property,数据类型为bool.即是存 ...
随机推荐
- [string]Valid Parentheses
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- 算法竞赛中G++编译器的编译指令简单说明
算法竞赛使用的在线判题平台在FAQ会给出提交的代码是通过什么指令进行编译的.比如hustoj给出的c++编译指令通常是: C++: g++ Main.cc -o Main -fno-asm -O2 - ...
- mklink修改Chrome缓存目录
管理员命令打开CMDmklink /D "C:\Users\Administrator\AppData\Local\Google\Chrome\User Data" "C ...
- python基础教程
转自:http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html Python快速教程 作者:Vamei 出处:http://www.cn ...
- ZRender源码分析6:Shape对象详解之路径
开始 说到这里,就不得不提SVG的路径操作了,因为ZRender完全的模拟了SVG原生的path元素的用法,很是强大. 关于SVG的Path,请看这里: Path (英文版) 或者 [MDN]SVG教 ...
- Android之 compileSdkVersion, minSdkVersion, and targetSdkVersion
在一年之中,也有可能只是几个月后,你会发布你的Android应用程序.但是这中间有可能会发布新的版本的Android系统,比如:6.0+. 你肯定希望你的应用可以向前兼容,当用户升级到新的Androi ...
- CentOS 7 上搭建LNMP环境
(转自美团云知识库Chris) 简介 LNMP是Linux.Nginx.MySQL(MariaDB)和PHP的缩写,这个组合是最常见的WEB服务器的运行环境之一.本文将带领大家在CentOS 7操作系 ...
- python基础教程第3章——字符串
1.字符串格式化 字符串格式化操作符%+转换标志+最小字段宽度+点后跟精度值+转换类型 String模块提供另外一种格式化方式 from string import Template s=Templa ...
- leetcode算法刷题(二)——动态规划(一)
上次刷了五六道题,都是关于string处理的,这次想换个知识点刷一下,然后再回头刷string的题,当做复习.. 这几天主要会选择动态规划的题目,因为以前从没刷过这方面的东西,很多东西都不是很懂..就 ...
- C++临时对象销毁时间
下面这段代码会输出什么? const char* p = string("hello temprary string").c_str(); cout << p; 下面这 ...