栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

如何在 ASP.NET Core 5 中重载 Action 方法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在 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

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号