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

本文介绍多种在ASP.NET MVC应用中获取当前控制器和动作名称的方法,包括使用控制器上下文、请求上下文及自定义扩展方法等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回答(13)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

这是我到目前为止:

var actionName = filterContext.ActionDescriptor.ActionName;

var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

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

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

}

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

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)?.FirstOrDefault();

}

if (routedata == null)

return;

Func getValue = (s) =>

{

object o;

return routedata.Values.TryGetValue(s, out o) ? o.ToString() : String.Empty;

};

this.CurrentAction = getValue("action");

this.CurrentController = getValue("controller");

}

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

@ViewData["controllerName"]

> @ViewData["actionName"]

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

您可以像任何变量一样从操作中获取控制器名称或操作名称 . 它们只是特殊的 (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;

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

为什么不简单一些?

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

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

c4cc279d-d098-4501-a7da-115a59bbccfe.png

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

可能有用 . 我需要在控制器的 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,它似乎在我的应用程序中正常工作 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

删除需要 ToString() 调用使用

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值