如何在 ASP.NET Core 5 中過載 Action 方法
ASP.NET Core 5 是一個開源的用於構建現代化web程式的開發框架,由於 ASP.NET Core 5 是基於 .NET Core 執行時,有了它,你可以將 web程式 執行在 Windows,Linux 和 Mac 上,值得注意的是, ASP.NET Core 5 整合了 Web API 和 MVC。
接下來回到本篇主題,何為方法過載? 就是讓多個不同簽名的方法共享一個方法名的技術,這種技術在 C# 中被廣泛使用,但用在 ASP.NET 5 中就不是那麼直觀了,這篇文章我們就來討論如何過載 Action。
action 是什麼
Action 就是 Controller 下標記為 public 並且 沒有被 [NonAction]
特性標記的方法,如下程式碼:
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
雖然看起來和普通方法一樣,但是這些方法必須遵守下面這些約束。
-
Action 方法必須是 public
-
Action 不能是 static
-
Action 方法不能像 普通方法 一樣可以引數過載
當你建立好 MVC 專案,預設的 Index Action 也會自動建立,在 Startup.Configure 下的路由配置中也預設配置了此Action,如下程式碼所示:
public class Startup
{
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
如果你不想使用預設的 Index,可以修改成其他你認為適合的,比如 Values
。
public class Startup
{
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Values}/{id?}");
});
}
}
使用相同的 謂語動詞 過載 action 方法
首先瞄一下 HomeController 類是啥樣子。
public class HomeController : Controller
{
private readonly ILogger _logger;
public HomeController(ILogger logger)
{
_logger = logger;
}
public IActionResult Index()
{
return View();
}
public IActionResult Index(string text)
{
return View();
}
public IActionResult Privacy()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None,
NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel
{
RequestId = Activity.Current?.Id ??
HttpContext.TraceIdentifier
});
}
}
注意上面類中我新增了一個 public IActionResult Index(string text)
方法,編譯器沒有給出任何錯誤提示,然而把應用程式跑起來,你會遇到一個執行時錯誤,如下圖所示:
使用不同的 謂語動詞 過載 action
現在修改一下 過載方法Index, 在新加入的過載方法上標上 HttpPost
特性,程式碼如下所示:
[HttpPost]
public IActionResult Index(string text)
{
return View();
}
當再次執行應用程式,這次就沒有任何編譯時或者執行時錯誤了,如下圖所示:
使用 ActionName 特性 過載 action
可以透過 ActionName 特性實現 Action 方法的過載,值得注意的是,ActionName 特性中標記的名字不能相同,如下程式碼所示:
[ActionName("Index")]
public IActionResult Index()
{
return View();
}
[ActionName("Index With Parameter")]
public IActionResult Index(string text)
{
return View();
}
再次執行程式,一切都是ok的,沒有任何編譯時或者執行時錯誤,截圖如下:
使用 Route 特性 過載 action
你可以使用 RouteAttribute 特性來實現 action 過載,下面的程式碼片段展示瞭如何去實現。
public IActionResult Index()
{
return View();
}
[Route("Home/Index/{i:int}")]
public IActionResult Index(int i)
{
return View();
}
[Route("Home/Index/{isDeleted:bool}")]
public IActionResult Index(bool isDeleted)
{
return View();
}
使用 NonAction 特性 過載 action
你可以使用 NonActionAttribute 來標記某些方法,從而在執行時讓 asp.net core 不把此方法 當作 action 對待,下面的程式碼展示了在 Index 上使用 NonActionAttribute 來實現 Index 的過載。
public IActionResult Index()
{
return View();
}
[NonAction]
public IActionResult Index(string text)
{
return View();
}
在 ASP.NET 5 中,如果兩個 action 的名字一樣,這就讓執行時很尷尬,因為它是以 action 為單位,所以一定會返回執行時錯誤,還有一點要注意的是,Action 的名字 是不區分大小寫的,也就是說:/Home/Index
和 /HOME/INDEX
是一樣的,所以透過 url 的變化切入到各個 過載方法 中,這是一個很有技巧的技術,解決辦法就是透過本篇介紹的幾種方式來完美實現!
更多高質量乾貨:參見我的 GitHub: [csharptranslate] github.com/ctripxchuang/csharptranslate
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4289/viewspace-2826900/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何在 ASP.Net Core 中實現 健康檢查ASP.NET
- ASP.NET MVC 5呼叫其他ActionASP.NETMVC
- ASP.NET Core 6.0對熱過載的支援ASP.NET
- 如何在 ASP.Net Core 中使用 LamarASP.NET
- 如何在ASP.NET Core 中使用IHttpClientFactoryASP.NETHTTPclient
- 如何在ASP.NET Core中編寫高效的控制器ASP.NET
- 讓ASP.NET Web API的Action方法ASP.NETWebAPI
- 如何在 ASP.NET Core 中使用 API AnalyzerASP.NETAPI
- ASP.NET Core 過濾器ASP.NET過濾器
- 在 ASP.NET Core 中使用多種方式給 Action 傳參ASP.NET
- ASP.NET MVC筆記 之 Action 過濾器ASP.NETMVC筆記過濾器
- 如何在 ASP.NET Core 中寫出更乾淨的 ControllerASP.NETController
- 5種設定ASP.NET Core應用程式URL的方法ASP.NET
- 如何在 ASP.Net Core 中使用 SerilogASP.NET
- Action中找不以getDataSource方法
- Asp.Net中的Action和Func委託ASP.NET
- 如何在 vuex action 中獲取到 vue 例項Vue
- [翻譯 EF Core in Action 2.4] 載入相關資料
- ASP.NET Core微服務如何在雲環境中跨平臺服務?ASP.NET微服務
- ASP.NET 5 已終結,迎來 ASP.NET Core 1.0 和 .NET Core 1.0ASP.NET
- Docker & ASP.NET Core (5):Docker ComposeDockerASP.NET
- 【asp.net core 系列】14 .net core 中的IOCASP.NET
- 理解ASP.NET Core - 過濾器(Filters)ASP.NET過濾器Filter
- 如何在ASP.NET中下載檔案ASP.NET
- Python中的過載方法Python
- 如何在Python中實現函式過載Python函式
- ASP.NET Core 入門教程 5、ASP.NET Core MVC 檢視傳值入門ASP.NETMVC
- 聊聊ASP.NET Core中的配置ASP.NET
- ASP.NET Core 中的快取ASP.NET快取
- [轉載] Java中如何在方法中return返回多個值Java
- 【譯】ASP.NET Core updates in .NET 5 Preview 8ASP.NETView
- [.net core學習] .net core中的MD5CryptoServiceProvider取代方法IDE
- Asp.Net Core中利用過濾器控制Nginx的快取時間ASP.NET過濾器Nginx快取
- 自動擋換手動擋:在 ASP.NET Core 3.0 Middleware 中手動執行 Controller ActionASP.NETController
- ASP.NET中檔案上傳下載方法集合ASP.NET
- ASP.NET Core 2.0網址重定向方法ASP.NET
- Java繼承中成員方法的overload(過載/過載)Java繼承
- 在 ASP.NET Core 中禁用HTTPSASP.NETHTTP