- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
随着 C# 6 中 nameof
运算符的引入,您可以通过编程方式获取操作名称,而无需魔术字符串:
<p>@Html.ActionLink("Contact", nameof(HomeController.Contact), "Home")</p>
如果您不更改 View 的名称,这会很好用。
但是,如果操作方法使用 [ActionName]
属性,是否有办法获取正确的操作名称(并避免使用魔法字符串)?也许通过 nameof()
和扩展方法的组合?
[ActionName("Contact2")]
public ActionResult Contact()
{
// ...
}
在此示例中,nameof(HomeController.Contact)
将返回字符串“Contact”和 URL“http://localhost:2222/Home/Contact”,而正确的 URL 应为“http://localhost:2222/Home/Contact2”,因为[ActionName("Contact2")]
属性。
最佳答案
没有。你不能。因为属性名称已经是一个魔术字符串,并且出于所有意图和目的, Controller 方法的名称本身就是一个魔术字符串(在您为操作使用隐式名称的情况下)。魔法弦并不坏,它们只是经常被误用。在这种情况下,您最好只使用常量。
internal const string ContactActionName2 = nameof(ContactActionName2);
和
[ActionName(ContactActionName2)]
和
HomeController.ContactActionName2
应该足以满足您的用例。
但是,由于每个人都对此大发雷霆,我决定去寻找一个根本不依赖字符串的解决方案(除了你无法避免依赖的 - Action 名称)。我不喜欢这个解决方案,因为 1) 它太过分了,2) 它仍然只是访问一个字符串值,这可以使用常量更简单地完成,3) 实际上你必须将整个方法调用写成一个表达式,并且4) 它会在您每次使用时分配一个表达式。
public static class ActionNameExtensions<TController>
{
public static string FindActionName<T>(Expression<Func<TController, T>> expression)
{
MethodCallExpression outermostExpression = expression.Body as MethodCallExpression;
if (outermostExpression == null)
{
throw new ArgumentException("Not a " + nameof(MethodCallExpression));
}
return outermostExpression.Method.GetCustomAttribute<ActionNameAttribute>().Name;
}
}
示例用法:
public class HomeController : Controller
{
[ActionName("HelloWorld")]
public string MyCoolAction(string arg1, string arg2, int arg4)
{
return ActionNameExtensions<HomeController>.FindActionName(
controller => controller.MyCoolAction("a", "b", 3)
);
}
}
可以编写重载来接受没有 void
返回的方法。虽然这有点奇怪,因为这应该用于 Controller 方法,通常会返回一个值。
关于c# - 使用 ActionName 属性时如何获取 Action 名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51937430/
我一直在构建一个 WebAPI,尝试使用 ActionName 路由到正确的方法。它适用于我尝试调用的一种方法,但另一种方法出现 404 错误。 我的 WebAPI 配置文件: public stat
我正在尝试学习 John Papa 在 PluralSight.com 上关于 SPA 的类(class),但遇到了这个奇怪的问题。 public class LookupController
使用“ActionName”属性为操作方法设置别名有什么好处?在为用户提供使用其他名称调用操作方法的选项方面,我确实没有看到它有多大好处。指定别名后,用户只能使用别名调用操作方法。但如果这是必需的,那
在阅读 mcv3 时,我遇到了一个名为 [ActionName] 的属性名称。 .它实际上为操作方法提供了一个新名称。我测试了一个让我思考的场景;内部是如何工作的。当我的 Controller 类中有
随着 C# 6 中 nameof 运算符的引入,您可以通过编程方式获取操作名称,而无需魔术字符串: @Html.ActionLink("Contact", nameof(HomeController.
属性是否类似于 [ActionName]但是 Controller 存在吗? 最佳答案 不,没有这样的属性。你必须自己写 IControllerFactory .您可以从 DefaultControl
这是我的旧代码 protected override bool OnPreAction(string actionName, System.Reflection.MethodInfo meth
我正在使用注释开发 struts 2.0,并创建了一个 Web 项目,在该项目中我只是进行登录并在成功登录后重定向到另一个 jsp。但是,每当我尝试登录时,它都会显示一条错误消息:- 没有映射与上下文
正如您在下面看到的,在我的 ActionFilter 中,我尝试获取 ActionExecutingContext.ActionDescriptor 的 ActionName 和 MethodInfo
我需要显示实体 Request 的一些子对象 (Items)。我发现传递包含比原始请求实体更多信息的 View 而不是请求。我将此 View 称为 RequestInfo,它还包含原始请求 Id。 然
我想使用 viewbag 调用操作链接。我尝试了类似下面的方法,但没有成功.. @Html.ActionLink("click me!", @ViewBag.Link, "Home", new {@c
非常标准的代码 using (Ajax.BeginForm("Search", "Subscriber", null, new AjaxOptions
我一直无法尝试拥有多个“Get”方法,同时还具有默认值/api/{controller}。这是一个带有伪代码的示例(是的,我知道它会返回完全相同的代码)。 错误:当我尝试转到 /api/courses
我有一个 lua_State 准备好使用将调用 actionname 的脚本。在脚本启动之前,需要注册一个 void(*action)()。此过程由无权访问我的 lua_State 的客户端调用,客户
以下路由在我的 WebApiConfig.cs 中: // routing for /profile/ config.Routes.MapHttpRoute( name: "profile",
我创建了一个名为 ApplicationController 的 Controller ,它向我的所有 View 发送公共(public)信息,我系统中的每个 Controller 都继承自它。 在部
我正在开发一个 ASP.NET Core 3.1 MVC 网站,该网站使用域名来确定本地化的文化。 例如,所有请求都进入域 example.com会有 en-US文化,而所有请求都进入域 exampl
我使用自定义 AuthorizationFilter 如下所示: public class ActionAuthorizeAttribute : AuthorizeAttribute { protec
这个问题在这里已经有了答案: 关闭10年前. Possible Duplicate: ASP.NET MVC - Can i have multiple names for the same acti
我是一名优秀的程序员,十分优秀!