ActionName的目的


87

使用“ ActionName”属性为操作方法设置别名有什么好处?在为用户提供使用其他名称调用操作方法的选项方面,我确实没有看到太多好处。指定别名后,用户只能使用别名来调用操作方法。但是,如果需要这样做,那么用户为什么不更改操作方法的名称,而不是为其指定别名?

如果有人可以为我提供“ ActionName”使用示例,在该示例中可以提供很大的好处或最好使用它,那么我将不胜感激。


最常见的原因是当您同时拥有GET和POST方法且签名相同时。参见@CarlosMuñoz答案
RickAndMSFT '16

Answers:


132

它允许您以数字开始操作,或在标识符中包含.net不允许的任何字符。-最常见的原因是它允许您使用具有相同签名的两个动作(请参阅任何脚手架控制器的GET / POST Delete动作)

例如:您可以在网址操作名称http://example.com/products/create-productvshttp://example.com/products/createproduct或中使用破折号http://example.com/products/create_product

public class ProductsController {

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

}

46
它还允许您使用操作名称,这些名称可能是ControllerView或File上的方法。

@gram,我们不能在不指定别名的情况下在控制器上调用普通方法吗?我想我们可以。
哈桑·法欣

2
如果您想命名您的 Action View()则会遇到问题,因为View()当前控制器中的所有引用都将解析为该名称,Action而不是基础基本方法。因此,要解决此问题,您可以使用ActionName属性允许View操作,但在内部您可以调用它PublicView或类似的方法。
2011年

2
我认为您必须使用return View("CreateProduct").NET或将无法找到诸如create-product.aspxcreate-product.cshtml-至少我的代码是这样工作的。
阿基里斯

@gram那么你怎么做呢?显然没有属性。
John

61

如果您有两个具有相同签名且应该具有相同URL的操作,这也很有用。

一个简单的例子:

public ActionResult SomeAction()
{
    ...
}

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

是有道理的,但是在什么情况下使用不带参数的HttpPost?我知道有可能的原因,例如返回JSON和避免GET的安全性问题。我只是想知道你是什么。
normalmike

2
参数列表在这里不是重要的部分。也许有一个更好的例子,关键是您可以根据需要进行操作。
卡洛斯·穆尼奥斯

1
我们也可以通过将“ SomeActionPost”替换为“ SomeAction”来做到这一点,那么ActionName的用途是什么?
Jilani pasha

如果两个方法具有相同的参数,则不能使用相同的名称。在这种情况下,[ActionName]重命名为在ASP中注册的操作(而不是方法)。NET MVC路由表到预期的一个。
卡洛斯·穆尼奥斯

38

我在用户下载报告时使用它,以便他们可以轻松地将自己的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编码器,2016年

2

试试这个代码:

public class ProductsController
 {

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

}


0

当您需要实现方法重载时,它也很有用。

 public ActionResult ActorView()
        { 

            return View(actorsList);
        }


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

在这里,一个ActorView不接受任何参数,而另一个则接受int。第一种方法用于查看演员列表,另一种方法用于在删除ID为“ id”的项目后显示同一演员列表。无论何时需要方法重载,都可以将操作名称用作“ ActorViewOverload”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.