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

时间:2013-08-15 08:03:16

标签: c# asp.net-mvc controller action

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

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

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

14 个答案:

答案 0 :(得分:321)

string actionName = this.ControllerContext.RouteData.Values["action"].ToString();
string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString();

答案 1 :(得分:55)

以下是获取该信息的一些扩展方法(它还包括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();

答案 2 :(得分:23)

可能有用。我需要在控制器的构造函数中执行操作,并且它出现在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,它似乎在我的应用程序中正常工作。

答案 3 :(得分:9)

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();
    }
}

答案 4 :(得分:4)

这是我到目前为止所做的:

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

答案 5 :(得分:2)

 @this.ViewContext.RouteData.Values["controller"].ToString();

答案 6 :(得分:1)

您可以像操作任何变量一样从操作中获取控制器名称或操作名称。它们只是特殊的 (控制器和操作) 并且已经定义,因此除了告诉您需要它们之外,您不需要做任何特殊的事情来获取它们。

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;
    }

答案 7 :(得分: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");
    }
}

答案 8 :(得分:1)

  

在OnActionExecuting中使用给定行代表Action和Controller名称。

string actionName = this.ControllerContext.RouteData.Values [&#34; action&#34;]。ToString();

string controllerName = this.ControllerContext.RouteData.Values [&#34; controller&#34;]。ToString();

答案 9 :(得分:1)

试试这个代码

将此覆盖方法添加到控制器

protected override void OnActionExecuting(ActionExecutingContext actionExecutingContext)
{
   var actionName = actionExecutingContext.ActionDescriptor.ActionName;
   var controllerName = actionExecutingContext.ActionDescriptor.ControllerDescriptor.ControllerName;
   base.OnActionExecuting(actionExecutingContext);
}

答案 10 :(得分:0)

无需ToString()来电使用

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

答案 11 :(得分:0)

将此内容添加到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(&#34; _Breadcrumb&#34)

<强> _Breadcrumb.cshtml

<span>
    <a href="../@ViewData["controllerName"]">
        @ViewData["controllerName"]
    </a> > @ViewData["actionName"]
</span>

答案 12 :(得分: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进行测试。

答案 13 :(得分:-8)

为什么不简单一些?

只需调用Request.Path,它将返回由“/”

分隔的字符串

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

enter image description here