var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;
if (routeValues != null)
{
if (routeValues.ContainsKey("action"))
{
var actionName = routeValues["action"].ToString();
}
if (routeValues.ContainsKey("controller"))
{
var controllerName = routeValues["controller"].ToString();
}
}
2
以下是获取该信息的一些扩展方法(它还包括ID):
public static class HtmlRequestHelper
{
public static string Id(this HtmlHelper htmlHelper)
{
var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;
if (routeValues.ContainsKey("id"))
return (string)routeValues["id"];
else if (HttpContext.Current.Request.QueryString.AllKeys.Contains("id"))
return HttpContext.Current.Request.QueryString["id"];
return string.Empty;
}
public static string Controller(this HtmlHelper htmlHelper)
{
var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;
if (routeValues.ContainsKey("controller"))
return (string)routeValues["controller"];
return string.Empty;
}
public static string Action(this HtmlHelper htmlHelper)
{
var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;
if (routeValues.ContainsKey("action"))
return (string)routeValues["action"];
return string.Empty;
}
}
您可以像任何变量一样从操作中获取控制器名称或操作名称 . 它们只是特殊的 (controller and action) 并且已经定义,因此除了告诉您需要它们之外,您不需要做任何特殊的事情来获取它们 .
public string Index(string controller,string action)
{
var names=string.Format("Controller : {0}, Action: {1}",controller,action);
return names;
}
或者,您可以在模型中包含控制器,操作以获取其中的两个以及您的自定义数据 .
public class DtoModel
{
public string Action { get; set; }
public string Controller { get; set; }
public string Name { get; set; }
}
public string Index(DtoModel baseModel)
{
var names=string.Format("Controller : {0}, Action: {1}",baseModel.Controller,baseModel.Action);
return names;
}
13 回答
这是我到目前为止:
string actionName = this.ControllerContext.RouteData.Values [“action”] . ToString();
string controllerName = this.ControllerContext.RouteData.Values [“controller”] . ToString();
这是获取名称最简单,最实用的答案:
要么
上面的代码使用asp.net mvc 5进行测试 .
以下是获取该信息的一些扩展方法(它还包括ID):
用法:
这对我来说似乎很好(到目前为止),如果你使用属性路由也可以 .
将其添加到GetDefaults()方法内的基本控制器中
将控制器实现为 Basecontroller
添加部分视图_Breadcrumb.cshtml并使用@ Html.Partial(“_ Breadcrumb”)将其添加到所有必需的页面中
_Breadcrumb.cshtml
您可以像任何变量一样从操作中获取控制器名称或操作名称 . 它们只是特殊的 (controller and action) 并且已经定义,因此除了告诉您需要它们之外,您不需要做任何特殊的事情来获取它们 .
或者,您可以在模型中包含控制器,操作以获取其中的两个以及您的自定义数据 .
为什么不简单一些?
只需调用
Request.Path
,它将返回由"/"分隔的字符串然后你可以使用
.Split('/')[1]
来获取控制器名称 .可能有用 . 我需要在控制器的 constructor 中执行操作,并且它出现在MVC生命周期的这一点上,
this
尚未初始化,并且ControllerContext = null
. 我没有深入研究MVC生命周期并找到适当的函数名来覆盖,而是在RequestContext.RouteData
中找到了该动作 .但是为了这样做,与构造函数中的任何
HttpContext
相关用法一样,您必须指定完整的命名空间,因为this.HttpContext
也尚未初始化 . 幸运的是,System.Web.HttpContext.Current
似乎是静态的 .注意:可能不是最受支持的方式来访问HttpContext中的所有属性,但对于RequestContext和Session,它似乎在我的应用程序中正常工作 .
删除需要
ToString()
调用使用