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

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

如何从控制器中的动作方法中获得控制器和动作的名称?还是说我需要反思一下?


当前回答

为什么不做一些简单的事情呢?

只需调用请求。路径,它将返回一个以/分隔的字符串

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

其他回答

为什么不做一些简单的事情呢?

只需调用请求。路径,它将返回一个以/分隔的字符串

然后你可以使用. split('/')[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();
    }
}

将此添加到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 = filterContext.ActionDescriptor.ActionName;
var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;

这对我来说似乎工作得很好(到目前为止),如果您使用属性路由也同样有效。

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