C# 获取MVC视图中当前控制器操作的属性
我希望在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
@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()
获取当前控制器的类型