一、URL Routing
1.添加URL路由映射的一般方法(在RegisterRoutes方法中添加):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//第一种(建议采用这种):
routes.MapRoute(
"MyRoute"
,
// 路由名称
"{controller}/{action}/{id}"
,
// 带有参数的 URL
new
{ controller =
"Default"
, action =
"Index"
, id = UrlParameter.Optional },
// 参数默认值
new
{ controller=
@"\w+"
,action=
@"^Get|Update|Delete\w+$"
,id=
@"\d+"
}
//路由约束
);
//第二种:
Route myRoute =
new
Route(
"{controller}/{action}/{id}"
,
// 带有参数的 URL
new
RouteValueDictionary(
new
{ controller =
"Default"
, action =
"Index"
, id = UrlParameter.Optional }),
// 参数默认值
new
RouteValueDictionary(
new
{ controller =
@"\w+"
, action =
@"^Get|Update|Delete\w+$"
, id =
@"\d+"
}),
//路由约束
new
MvcRouteHandler());
routes.Add(
"MyRoute"
, myRoute);
|
2.自定义路由约束:通过实现 IRouteConstraint 接口来定义自己的路由约束规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/// <summary>
/// 访问时间约束(当大于指定的时间才允许访问)
/// </summary>
public
class
AccessTimeConstraint : IRouteConstraint
{
DateTime? allowAccessTime =
null
;
public
AccessTimeConstraint(DateTime allowAccessTime)
{
this
.allowAccessTime = allowAccessTime;
}
public
bool
Match(HttpContextBase httpContext, Route route,
string
parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
return
allowAccessTime ==
null
?
true
: ((DateTime)allowAccessTime).CompareTo(DateTime.Now) <= 0;
}
}
routes.MapRoute(
"default"
,
"test/{action}/{id}"
,
new
{ controller =
"Default"
, action =
"Index"
, id = UrlParameter.Optional },
new
{accessTimeConstraint=
new
AccessTimeConstraint(DateTime.Parse(
"2015-08-28 10:00:00"
))});
|
3.Area注册的路由与Global注册的路由发生冲突解决方案:为Global注册的路由指定命名空间,路由系统在对路由进行匹配时,优先匹配指定了命名空间的controller,如果匹配到则即刻停止查找,如果在指定的命名空间下没有匹配到对应的controller,再按照一般的方式进行匹配。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public
override
void
RegisterArea(AreaRegistrationContext context) {
context.MapRoute(
"Admin_default"
,
"Admin/{controller}/{action}/{id}"
,
new
{ action =
"Index"
, id = UrlParameter.Optional }
);
}
public
static
void
RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute(
"{resource}.axd/{*pathInfo}"
);
routes.MapRoute(
name:
"Default"
,
url:
"{controller}/{action}/{id}"
,
defaults:
new
{ controller =
"Home"
, action =
"Index"
, id = UrlParameter.Optional },
namespaces:
new
[] {
"MvcApplication1.Controllers"
}
);
}
|
4.在 Controller 中从上下文对象中可以获取如下的状态数据:
5.Controller的基本工作顺序(有视图的情况):
-->IController.Execute-->Controller.CreateActionInvoker
-->IActionInvoker.InvokeAction-->ActionResult.ExecuteResult
-->ViewResultBase.FindView-->IVew.Render-->IViewEngine.ReleaseView
6.若要自定义Controller,只要实现IController接口并重写Execute方法即可,若要自定义ActionResult,只要继承ActionResult抽象类并重写ExecuteResult方法即可,若要自定义视图引擎,则需要继承ViewResultBase抽象类并重写FindView方法、实现IVew接口并重写Render方法,以及实现IViewEngine接口并重写ReleaseView方法
7.从 Action 传递数据到 View 的方式:
ViewBag:是动态(dynamic)的弱类型,在程序运行的时候解析,是 MVC3 中新增的特性,只在当前View有效。
ViewData:是字典集合,只在当前View有效,性能比 ViewBag 高,但是使用的时候需要类型转换。
TempData:是字典集合,一般用于两个请求之间临时缓存内容或页面间传递消息,保存在 Session 中,使用完以后则从 Session 中被清除。
本文转自 梦在旅途 博客园博客,原文链接:http://www.cnblogs.com/zuowj/p/4766867.html ,如需转载请自行联系原作者