【问题标题】:Purpose of ActionNameActionName 的目的
【发布时间】:2011-09-26 01:34:19
【问题描述】:

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

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

【问题讨论】:

  • 最常见的原因是当您同时拥有 GET 和 POST 方法并且签名相同时。见@Carlos Muñoz 回答

标签: asp.net-mvc asp.net-mvc-3


【解决方案1】:

此类表示用于操作名称的属性。它还允许开发人员使用与方法名称不同的操作名称。

【讨论】:

    【解决方案2】:

    试试这个代码:

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

    【讨论】:

      【解决方案3】:

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

      例如:您可以在 URL 操作名称 http://example.com/products/create-producthttp://example.com/products/createproducthttp://example.com/products/create_product 中允许使用破折号。

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

      【讨论】:

      • 它还允许您使用可能是 Controller 上的方法的操作名称,例如 View 或 File。
      • @gram,我们不能在不指定别名的情况下调用控制器上的普通方法吗?我想我们可以。
      • 如果你想命名你的 Action View() 那么你会遇到问题,因为当前控制器中对 View() 的所有引用都会解析为 Action 而不是底层的基本方法.所以要解决这个问题,你可以使用ActionName 属性来允许View 操作,但在内部你可以称之为PublicView 或类似的东西。
      • 我认为你必须return View("CreateProduct") 否则.NET 会唠叨找不到像create-product.aspxcreate-product.cshtml 这样的视图——至少我的代码是这样工作的。
      • @gram 那么你是怎么做到的呢?显然没有属性。
      【解决方案4】:

      当你需要实现方法重载时也很有帮助。

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

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

      【讨论】:

        【解决方案5】:

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

        一个简单的例子:

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

        【讨论】:

        • 有道理,但是在什么场景下使用不带参数的HttpPost呢?我知道有可能的原因,比如返回 JSON 和避免 GET 的安全问题。我只是想知道你的是什么。
        • 参数列表不是这里的重要部分。可能有一个更好的例子,关键是如果你需要,你可以这样做。
        • 我们也可以通过将“SomeActionPost”替换为“SomeAction”来做到这一点,那么ActionName有什么用??
        • 如果两个方法具有相同的参数,则不能将它们命名为相同。在这种情况下,[ActionName] 将操作(而不是方法)重命名为在 ASP 中注册的名称。 NET MVC 路由表到预期的路由表。
        【解决方案6】:

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

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

        【讨论】:

        • 这很聪明:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-21
        • 1970-01-01
        • 2022-07-01
        • 2016-04-12
        • 1970-01-01
        • 2017-01-26
        相关资源
        最近更新 更多