行动名称的目的

88

"ActionName"属性是指为一个操作方法设置别名的好处是什么?我真的看不出它在提供用户使用其他名称调用操作方法方面有多大好处。在指定别名之后,用户只能使用别名调用操作方法。但如果需要这样做,那么为什么用户不改变操作方法的名称而是指定别名呢?

如果有人可以为我提供一个使用"ActionName"的示例场景,以证明它能够提供巨大的好处或最好使用,我将不胜感激。


最常见的原因是当您同时拥有GET和POST方法并且签名相同时。请参见@Carlos Muñoz的答案。 - RickAndMSFT
6个回答

139

使用这个特性可以在操作名称中包含数字或任何.NET不允许在标识符中使用的字符。 - 最常见的原因是它允许您拥有两个具有相同签名的操作(请参见任何脚手架控制器的GET/POST删除操作)

例如:您可以允许连接符在URL操作名称中 http://example.com/products/create-product,而不是http://example.com/products/createproducthttp://example.com/products/create_product

public class ProductsController {

    [ActionName("create-product")]
    public ActionResult CreateProduct() {
        return View();
    }

}

48
它还允许您使用可能是Controller方法的动作名称,例如View或File。 - gram
@gram,我们不能在不指定别名的情况下在控制器上调用普通方法吗?我认为我们可以。 - Hasan Fahim
2
如果你想把你的Action命名为View(),那么你会遇到问题,因为当前控制器中所有对View()的引用都会解析到该Action而不是基础方法。所以为了解决这个问题,你需要使用ActionName属性来允许View操作,但内部你会将其称为PublicView或类似的名称。 - Buildstarted
3
我认为你需要return View("CreateProduct"),否则.NET会提示找不到create-product.aspxcreate-product.cshtml之类的视图文件。至少我的代码是这样工作的。 - Achilles
那么你怎么做呢?显然不是通过属性。 - John

62

如果你有两个具有相同签名的操作(Action),它们应该拥有相同的URL,那么这也很有用。

一个简单的例子:

public ActionResult SomeAction()
{
    ...
}

[ActionName("SomeAction")]
[HttpPost]
public ActionResult SomeActionPost()
{
    ...
}

听起来有道理,但在什么情况下您会使用没有参数的HttpPost呢?我知道可能有一些原因,比如返回JSON和避免使用GET时出现安全问题。我只是想知道您的用法是什么。 - regularmike
2
参数列表在这里并不重要。可能有更好的例子,重点是如果需要,你可以做到。 - Carlos Muñoz
1
我们可以通过将“SomeActionPost”替换为“SomeAction”来实现,那么ActionName有什么用途呢? - Jilani pasha
如果两个方法具有相同的参数,则不能将它们命名为相同的名称。在这种情况下,[ActionName] 会将在 ASP.NET MVC 路由表中注册的操作(而不是方法)重命名为预期的操作名称。 - Carlos Muñoz

39

我在用户下载报告时使用它,以便他们可以轻松地将其csv文件直接打开到Excel中。

[ActionName("GetCSV.csv")]
public ActionResult GetCSV(){
    string csv = CreateCSV();
    return new ContentResult() { Content = csv, ContentEncoding = System.Text.Encoding.UTF8, ContentType = "text/csv" };
}

2
那非常聪明 :) - SRQ Coder

2
尝试使用以下代码:
public class ProductsController
 {

    [ActionName("create-product")]
    public ActionResult CreateProduct() 
    {
        return View("CreateProduct");
    }

}

1

当你需要实现方法重载时,这也是非常有帮助的。

 public ActionResult ActorView()
        { 

            return View(actorsList);
        }


        [ActionName("ActorViewOverload")]
        public ActionResult ActorView(int id)
        {              
            return RedirectToAction("ActorView","Home");
        }
`

这里有两个ActorView,一个不接受参数,另一个接受int参数。 第一个方法用于查看演员列表,而另一个用于在删除ID为“id”的项目后显示相同的演员列表。 你可以在需要方法重载的地方使用动作名称“ActorViewOverload”。


1
这个类代表用于操作名称的属性。它允许开发者使用不同于方法名的操作名称。

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