C# 获取MVC视图中当前控制器操作的属性

C# 获取MVC视图中当前控制器操作的属性,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我希望在MVC视图上以可读的格式显示控制器的当前操作 我知道您可以通过以下方式获取当前操作的名称: @ViewContext.Controller.ValueProvider.GetValue(“操作”) 这将返回例如下面示例中的“索引” 我想做的是: [DisplayName=Resources.Overview] public ActionResult Index() { return View(); } 然后在页面上打印DisplayName,一些伪代码如下: @ViewCont

我希望在MVC视图上以可读的格式显示控制器的当前操作

我知道您可以通过以下方式获取当前操作的名称:
@ViewContext.Controller.ValueProvider.GetValue(“操作”)

这将返回例如下面示例中的“索引”

我想做的是:

[DisplayName=Resources.Overview]
public ActionResult Index()
{
    return View();
}
然后在页面上打印DisplayName,一些伪代码如下:

@ViewContext.Controller.ValueProvider.GetValue(“操作”).GetAttribute(“显示名称”)

这将从资源中返回“概述”


这是可能的吗?

为什么不在Viewbag中设置DisplayName,并在代码中检索每个需要它的页面

比如说,

public ActionResult Index()
{
    Viewbag.DisplayName = 'Resources.Overview'
    return View();
}
然后,在填充DisplayName值的任何视图中,您可以在顶部显示以下内容:

<head>
    @ViewBag.DisplayName
</head>

@ViewBag.DisplayName

为什么不在Viewbag中设置DisplayName并在代码中检索每个需要它的页面

比如说,

public ActionResult Index()
{
    Viewbag.DisplayName = 'Resources.Overview'
    return View();
}
然后,在填充DisplayName值的任何视图中,您可以在顶部显示以下内容:

<head>
    @ViewBag.DisplayName
</head>

@ViewBag.DisplayName

您应该首先使用Type.GetMethodInfo对方法进行反射

string actionName = ViewContext.RouteData.Values["Action"]
MethodInfo method = type.GetMethod(actionName);
var attribute = method.GetCustomAttributes(typeof(DisplayNameAttribute), false);
if (attribute.Length > 0)
   actionName = ((DisplayNameAttribute)attribute[0]).DisplayName;
else 
   actionName = type.Name;   // fallback to the type name of the controller
然后,您可以使用以下命令将actionName传递给视图

   ViewBag.name = actionName;

然后从视图中获取Viewbag变量

您应该首先使用Type.GetMethodInfo对方法进行反射

string actionName = ViewContext.RouteData.Values["Action"]
MethodInfo method = type.GetMethod(actionName);
var attribute = method.GetCustomAttributes(typeof(DisplayNameAttribute), false);
if (attribute.Length > 0)
   actionName = ((DisplayNameAttribute)attribute[0]).DisplayName;
else 
   actionName = type.Name;   // fallback to the type name of the controller
然后,您可以使用以下命令将actionName传递给视图

   ViewBag.name = actionName;

然后从视图中获取Viewbag变量

我开始意识到您实际上想要的是动作名称,因此我的方法虽然可能有效,但不会没有混乱。。。我将把它放在这里,但如果你不喜欢它,你可以忽略它:我已经考虑过了,但我也希望对我的控制器做同样的事情,它有一个显示名称,并同时显示这两个(甚至可能还有我可以在控制器级别设置的其他数据)。这将导致我不得不在每个方法上复制粘贴行,例如
ViewBag.ControllerDisplayName=Resources.Home
。这种低效率让我好奇,是否有一种解决方案符合我的想法。我同意,实施很容易,但它只是一团糟!我已经开始意识到你实际上想要的是动作名称,所以我的方法虽然可能有效,但不会没有混乱。。。我将把它放在这里,但如果你不喜欢它,你可以忽略它:我已经考虑过了,但我也希望对我的控制器做同样的事情,它有一个显示名称,并同时显示这两个(甚至可能还有我可以在控制器级别设置的其他数据)。这将导致我不得不在每个方法上复制粘贴行,例如
ViewBag.ControllerDisplayName=Resources.Home
。这种低效率让我好奇,是否有一种解决方案符合我的想法。我同意,实施很容易,但它只是一团糟!这似乎正是我需要的。还有一个问题:是否可以在视图本身中动态地使用它?我可以使用硬核,例如
Type-Type=Type.GetType(HomeController)但是否可以获取当前控制器的类型<代码>类型类型=类型.GetType(ViewContext.RoutedData.Values[“Controller”])似乎不起作用。如果我可以让这行工作,我会被设置,我会建议创建一个自定义的行动过滤器,你会把这个代码。您可以通过将其添加到
FilterConfig.cs
中,然后假设您添加了
DisplayName
属性,将
ViewBag
成员设置为全局。我不确定是否完全理解您的建议。我相信我将在共享布局中使用上述代码,并使用
@ViewContext.Controller.GetType()
获取当前控制器的类型这似乎正是我需要的。还有一个问题:是否可以在视图本身中动态地使用它?我可以使用硬核,例如
Type-Type=Type.GetType(HomeController)但是否可以获取当前控制器的类型<代码>类型类型=类型.GetType(ViewContext.RoutedData.Values[“Controller”])似乎不起作用。如果我可以让这行工作,我会被设置,我会建议创建一个自定义的行动过滤器,你会把这个代码。您可以通过将其添加到
FilterConfig.cs
中,然后假设您添加了
DisplayName
属性,将
ViewBag
成员设置为全局。我不确定是否完全理解您的建议。我相信我将在共享布局中使用上述代码,并使用
@ViewContext.Controller.GetType()
获取当前控制器的类型