在控制器中:
在ASP.NET MVC中的控制器类Controller中,有这个只读属性:1
2
3
4
5
6
7//
// 摘要:
// 为当前请求获取路由数据。
//
// 返回结果:
// 路由数据。
public RouteData RouteData { get; }
包含了路由信息.而RouteData
类是属于System.Web.Routing命名空间的.说明了该类不是ASP.NET MVC专有的类,而是属于ASP.NET的.
ASP.NET MVC就是通过这个路由来启动控制器和对应的action的.
仔细看看这个RouteData类型:1
2
3
4
5
6
7
8
9
10
11
12
13// 摘要:
// 封装有关路由的信息。
[TypeForwardedFrom("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")]
public class RouteData
{
public RouteData\(\);
public RouteData(RouteBase route, IRouteHandler routeHandler);
public RouteValueDictionary DataTokens { get; }
public RouteBase Route { get; set; }
public IRouteHandler RouteHandler { get; set; }
public RouteValueDictionary Values { get; }
public string GetRequiredString(string valueName);
}
其中有一个RouteValueDictionary
类型的Values属性,可以读出路由的值.我们就可以通过该属性来获取我们想要的值.
编写action代码:1
2
3
4
5
6public ActionResult TestRoute\(\)
{
string controller = RouteData.Values["controller"].ToString\(\);
string action = RouteData.Values["action"].ToString\(\);
return Content(controller + "|" + action);
}
运行程序:可以看到效果:
在View中
如果在View中,我们也同样可以通过类WebViewPage
的ViewContext
属性值来完整的获取到ControllerContext
.原因就是ViewContext
是继承自ControllerContext
的.可以通过下列代码看出:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26public class ViewContext : ControllerContext
{
public ViewContext\(\);
public ViewContext(ControllerContext controllerContext, IView view, ViewDataDictionary viewData, TempDataDictionary tempData, TextWriter writer);
public virtual bool ClientValidationEnabled { get; set; }
public virtual FormContext FormContext { get; set; }
public virtual TempDataDictionary TempData { get; set; }
public virtual bool UnobtrusiveJavaScriptEnabled { get; set; }
public virtual IView View { get; set; }
[Dynamic]
public dynamic ViewBag { get; }
public virtual ViewDataDictionary ViewData { get; set; }
public virtual TextWriter Writer { get; set; }
public void OutputClientValidation\(\);
}
而ControllerContext
类的定义中直接就拥有属性本文开头提到的RouteData
属性.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27// 摘要:
// 封装有关与指定的 System.Web.Routing.RouteBase 和 System.Web.Mvc.ControllerBase 实例匹配的
// HTTP 请求的信息。
public class ControllerContext
{
public ControllerContext\(\);
protected ControllerContext(ControllerContext controllerContext);
public ControllerContext(RequestContext requestContext, ControllerBase controller);
public ControllerContext(HttpContextBase httpContext, RouteData routeData, ControllerBase controller);
public virtual ControllerBase Controller { get; set; }
public IDisplayMode DisplayMode { get; set; }
public virtual HttpContextBase HttpContext { get; set; }
public virtual bool IsChildAction { get; }
public ViewContext ParentActionViewContext { get; }
public RequestContext RequestContext { get; set; }
public virtual RouteData RouteData { get; set; }
}
这样我们在view中可以通过如下代码来显示当前控制器和action的名称:1
2<div>controller:@ViewContext.RouteData.Values["controller"] </div>
<div>action:@ViewContext.RouteData.Values["action"]</div>
为了测试,我们编写两个action,分别调用该视图文件.1
2
3
4
5
6
7
8
9public ActionResult Index\(\)
{
return View\(\);
}
public ActionResult TestRoute\(\)
{
return View("Index");
}
然后看显示效果.
最终.我们得到了想要的结果..