gpt4 book ai didi

c# - 使用 ActionName 属性时如何获取 Action 名称?

转载 作者:行者123 更新时间:2023-12-03 19:29:03 25 4
gpt4 key购买 nike

随着 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com