首页 文章

从控制器中获取控制器和操作名称?

提问于
浏览
148

对于我们的Web应用程序,我需要根据视图保存获取和显示项目的顺序 - 或者确切地说 - 生成视图的控制器和操作(当然还有用户ID,但这不是重点) .

我不是在每个控制器动作中自己给出一个标识符(为了将它用于某些依赖于视图的DB输出排序),我认为从控制器和动作方法自动创建这个标识符会更安全,更容易 . 来自 .

如何从控制器中的action方法中获取控制器和操作的名称?或者我需要反思吗?我想这很简单,提前谢谢!

13 回答

  • 0

    这是我到目前为止:

    var actionName = filterContext.ActionDescriptor.ActionName;
    var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
    
  • 1

    在OnActionExecuting中使用给定的行作为Action和Controller名称 .

    string actionName = this.ControllerContext.RouteData.Values [“action”] . ToString();

    string controllerName = this.ControllerContext.RouteData.Values [“controller”] . ToString();

  • 0

    这是获取名称最简单,最实用的答案:

    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进行测试 .

  • 9
    @this.ViewContext.RouteData.Values["controller"].ToString();
    
  • 1
    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;
        }
    }
    

    用法:

    @Html.Controller();
    @Html.Action();
    @Html.Id();
    
  • 1

    这对我来说似乎很好(到目前为止),如果你使用属性路由也可以 .

    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");
        }
    }
    
  • 304

    将其添加到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>
    
  • -7

    您可以像任何变量一样从操作中获取控制器名称或操作名称 . 它们只是特殊的 (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;
        }
    
  • 50
    string actionName = this.ControllerContext.RouteData.Values["action"].ToString();
    string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString();
    
  • 4

    为什么不简单一些?

    只需调用 Request.Path ,它将返回由"/"分隔的字符串

    然后你可以使用 .Split('/')[1] 来获取控制器名称 .

    enter image description here

  • 0

    可能有用 . 我需要在控制器的 constructor 中执行操作,并且它出现在MVC生命周期的这一点上, this 尚未初始化,并且 ControllerContext = null . 我没有深入研究MVC生命周期并找到适当的函数名来覆盖,而是在 RequestContext.RouteData 中找到了该动作 .

    但是为了这样做,与构造函数中的任何 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,它似乎在我的应用程序中正常工作 .

  • 23

    删除需要 ToString() 调用使用

    string actionName = ControllerContext.RouteData.GetRequiredString("action");
    string controllerName = ControllerContext.RouteData.GetRequiredString("controller");
    

相关问题