从控制器中获取控制器和操作名称?
对于我们的Web应用程序,我需要根据视图(或者更准确的说)来保存获取和显示的项目的顺序,即生成视图的控制器和操作(当然还有用户标识,但这不是重点)。
我不是在每个控制器动作中自己给一个标识符(为了将它用于某些依赖于视图的DB输出sorting),我认为从控制器自动创build这个标识符会更安全,叫从。
如何从控制器的action方法中获取控制器的名称和动作? 还是我需要反思? 我想这很容易,提前感谢!
string actionName = this.ControllerContext.RouteData.Values["action"].ToString(); string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString();
以下是获取该信息的一些扩展方法(也包括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; } }
用法:
@Html.Controller(); @Html.Action(); @Html.Id();
可能有用。 我需要在控制器的构造函数中的操作,它出现在MVC生命周期的这一点, this
还没有初始化,并且ControllerContext = null
。 我只是在RequestContext.RouteData
find了这个动作,而不是深入研究MVC生命周期并find适当的函数名称来覆盖。
但是为了这样做,就像在构造函数中使用相关的HttpContext
,你必须指定完整的命名空间,因为这个this.HttpContext
也没有被初始化。 幸运的是,它似乎System.Web.HttpContext.Current
是静态的。
// controller constructor public MyController() { // grab action from RequestContext string action = System.Web.HttpContext.Current.Request.RequestContext.RouteData.GetRequiredString("action"); // grab session (another example of using System.Web.HttpContext static reference) string sessionTest = System.Web.HttpContext.Current.Session["test"] as string }
注:可能不是最受支持的方式来访问HttpContext中的所有属性,但对于RequestContext和Session,它似乎在我的应用程序中正常工作。
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(); } }
这是我迄今为止:
var actionName = filterContext.ActionDescriptor.ActionName; var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
您可以像任何variables一样从操作中获取控制器名称或操作名称。 他们只是特殊的(控制器和行动),并已经定义,所以你不需要做任何特别的事情来获得他们,除了告诉你需要他们。
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; }
这似乎对我来说很好(迄今为止),如果你正在使用属性路由,也可以。
public class BaseController : Controller { protected string CurrentAction { get; private set; } protected string CurrentController { get; private set; } protected override void Initialize(RequestContext requestContext) { this.PopulateControllerActionInfo(requestContext); } private void PopulateControllerActionInfo(RequestContext requestContext) { RouteData routedata = requestContext.RouteData; object routes; if (routedata.Values.TryGetValue("MS_DirectRouteMatches", out routes)) { routedata = (routes as List<RouteData>)?.FirstOrDefault(); } if (routedata == null) return; Func<string, string> getValue = (s) => { object o; return routedata.Values.TryGetValue(s, out o) ? o.ToString() : String.Empty; }; this.CurrentAction = getValue("action"); this.CurrentController = getValue("controller"); } }
@this.ViewContext.RouteData.Values["controller"].ToString();
删除ToString()
调用的使用需求
string actionName = ControllerContext.RouteData.GetRequiredString("action"); string controllerName = ControllerContext.RouteData.GetRequiredString("controller");
把它添加到GetDefaults()方法中的基础控制器中
protected override void OnActionExecuting(ActionExecutingContext filterContext) { GetDefaults(); base.OnActionExecuting(filterContext); } private void GetDefaults() { var actionName = filterContext.ActionDescriptor.ActionName; var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; }
实现你的控制器到Basecontroller
添加一个局部视图_Breadcrumb.cshtml并将其添加到所有需要的页面中@ Html.Partial(“_ Breadcrumb”)
_Breadcrumb.cshtml
<span> <a href="../@ViewData["controllerName"]"> @ViewData["controllerName"] </a> > @ViewData["actionName"] </span>
这是获取名称的最简单和最实际的答案:
var actionName = RouteData.Values["controller"]; var controllerName = RouteData.Values["action"];
要么
string actionName = RouteData.Values["controller"].ToString(); string controllerName = RouteData.Values["action"].ToString();
上面的代码用asp.net mvc 5进行testing。
在OnActionExecuting中为行为和控制器名称使用给定的行。
string actionName = this.ControllerContext.RouteData.Values [“action”]。ToString();
string controllerName = this.ControllerContext.RouteData.Values [“controller”]。ToString();
为什么不简单一点?
只需调用Request.Path
,它将返回一个由“/”分隔的string
然后你可以使用.Split('/')[1]
获得控制器名称。