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

Rob*_*ert 163 c# asp.net-mvc action controller

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

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

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

And*_*rei 331

string actionName = this.ControllerContext.RouteData.Values["action"].ToString();
string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString();
Run Code Online (Sandbox Code Playgroud)

  • 在某些情况下,您可能希望在View文件中拥有控制器的名称,那么您只需使用this.ViewContext.RouteData.Values ["controller"].ToString(); (13认同)

Joh*_*ski 59

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

用法:

@Html.Controller();
@Html.Action();
@Html.Id();
Run Code Online (Sandbox Code Playgroud)

  • 在 ASP.NET Core 中不起作用,因为 HttpContext.Current 不再存在 (5认同)

son*_*njz 24

可能有用.我需要在控制器的构造函数中执行操作,并且它出现在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
}
Run Code Online (Sandbox Code Playgroud)

注意:可能不是访问HttpContext中所有属性的最受支持的方式,但对于RequestContext和Session,它似乎在我的应用程序中正常工作.


Chr*_*nce 10

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();
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

这是我到目前为止所拥有的:

var actionName = filterContext.ActionDescriptor.ActionName;
var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
Run Code Online (Sandbox Code Playgroud)


Mat*_*nda 5

这是获取名字的最简单、最实用的答案:

var actionName = RouteData.Values["action"];
var controllerName = RouteData.Values["controller"];
Run Code Online (Sandbox Code Playgroud)

或者

string actionName = RouteData.Values["action"].ToString();
string controllerName = RouteData.Values["controller"].ToString();
Run Code Online (Sandbox Code Playgroud)

上面的代码使用 asp.net mvc 5 进行测试。


Hos*_*deh 5

 @this.ViewContext.RouteData.Values["controller"].ToString();
Run Code Online (Sandbox Code Playgroud)