获取控制器名称和动作名称并在主页中填充ViewData?

32

我有一个SuperController,它将从所有控制器继承。在构造函数中,我试图使用ControllerName和ActionName填充ViewData。

我不会将ControllerName和ActionName作为ViewData传递。我有一个需要ControllerName和ActionName的方法,我需要将该方法的返回值作为ViewData传递。

我该如何做?


获取动作和控制器名称,请参见此链接:https://dev59.com/XmMl5IYBdhLWcg3woYPa#31749391 - Mustafa ASAN
4个回答

62

这些名称将反映请求URL的大小写。您对它们的操作不应区分大小写。(我曾经掉进了这个陷阱。) - Frédéric

6

试试这个:

RouteData.Values.First().Value.ToString()

如果您使用自定义路由(例如语言/控制器/操作),则控制器可能不是第一个条目。 - iCollect.it Ltd

3
假设我正确地理解了您的帖子,并且您不是试图在视图中访问控制器/操作名称,而是尝试对它们进行操作,并将结果放入视图数据:
您不能在构造函数中执行此操作,因为上下文尚未创建。您需要覆盖Initialize方法:
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        base.Initialize(requestContext);

        //here the routedata is available
        ViewData["controller_name"] = (ControllerContext.RouteData.Values["Controller"];
    }

(请注意,您可以仅传递ControllerContext.RouteData到您的函数,并让它选择需要的值。)

1

我需要从视图中经常获取它们,所以我从稍微不同的角度着手——编写了一些扩展方法到HtmlHelper中,以提供当前的ControllerName和ActionName。这样更容易处理,因为您不需要担心深入ViewData[]包或在适当的位置注入内容。


我认为这样的扩展方法更适合于UrlHelper,而不是HtmlHelper。这两个值与HTML没有任何关系。 - David Brown
好观点 - 我认为实现方式可能已经被重构成那样了。无论哪种情况,理论上都大致相同 - 将其拉出而不是推入。 - Wyatt Barnett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接