2011-06-30 64 views
67

使用「ActionName」屬性爲操作方法設置別名有什麼好處?我真的沒有看到它的好處,給用戶提供了調用其他名稱的操作方法的選項。指定別名後,用戶只能使用別名調用操作方法。但是,如果這是必需的,爲什麼用戶不更改操作方法的名稱,而不是指定別名?ActionName的用途

我真的很感激,如果任何人都可以提供一個使用「ActionName」的例子,它可以提供很大的好處或最好使用的場景。

+0

最常見的原因是,如果您同時具有GET和POST方法並且簽名相同。請參閱@CarlosMuñoz答案 – RickAndMSFT

回答

109

它允許您使用數字開始您的操作或包含任何.net在標識符中不允許的字符。 - 最常見的原因是它可以讓你有兩個操作具有相同簽名(見GET/POST刪除任何腳手架控制器的動作)

例如:你可以讓你的URL操作名義http://example.com/products/create-product內破折號VS http://example.com/products/createproducthttp://example.com/products/create_product

public class ProductsController { 

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

} 
+40

它還允許您使用可能是'Controller'上的方法的操作名稱,例如View或File。 – gram

+0

@gram,我們不能在沒有指定別名的情況下在控制器上調用常規方法嗎?我想我們可以。 –

+2

如果你想命名你的'Action'' View()',那麼你會遇到問題,因爲在你的當前控制器中所有對'View()'的引用都會解析爲'Action'而不是底層方法。所以爲了解決這個問題,你可以使用'ActionName'屬性來允許'View'動作,但是在內部你會把它稱爲'PublicView'或類似的東西。 – Buildstarted

51

如果您有兩個具有相同網址的相同簽名的動作也很有用。

一個簡單的例子:

public ActionResult SomeAction() 
{ 
    ... 
} 

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

謝謝@CarlosMuñoz。這似乎是它的一個好用處。 –

+0

有道理,但是在什麼情況下使用不帶參數的HttpPost?我知道有可能的原因,比如返回JSON並避免使用GET的安全問題。我只是想知道你的是什麼。 – regularmike

+1

參數列表並不是這裏的重要部分。有一個更好的例子,重點是如果你需要的話,你可以做到這一點。 –

28

當用戶下載的報告,讓他們可以直接打開自己的CSV文件導入Excel容易我使用它。

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

這非常聰明:) –

5

ActionName屬性用於向外部世界公開具有不同名稱的.NET操作方法。在下面的情況下,你可以利用ActionName屬性:

  1. 對於SEO(搜索引擎優化)你想在你的URL比.NET動作方法的名字暴露了更多的有意義的動作名稱。

  2. 防止功能重載相關問題。假設您已獲得DELETE操作方法名稱,其GET和POST操作方法接受相同的參數。在這種情況下,你會得到編譯時錯誤。爲了解決這個問題,你可以重命名你的.NET方法和ActionName屬性,你仍然可以保持暴露的同名。

對於更詳細的解釋,請訪問:ActionName attribute in ASP.NET MVC

-1

這也有利於當你需要實現方法重載。

public ActionResult ActorView() 
     { 

      return View(actorsList); 
     } 


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

這裏一個ActorView不接受參數,另一個接受int。 用於查看演員列表的第一種方法和用於在刪除ID爲'id'的項目後顯示相同的演員列表的第一種方法。 無論您需要方法重載,您都可以將操作名稱用作「ActorViewOverload」。

1

試試這個代碼:

public class ProductsController 
{ 

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

} 
0

此類表示用於動作的名稱的屬性。它還允許開發人員使用與方法名稱不同的操作名稱。