乐趣区

关于.net:如何在-ASPNET-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<HomeController> _logger;

        public HomeController(ILogger<HomeController> 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 的变动切入到各个 重载办法 中,这是一个很有技巧的技术,解决办法就是通过本篇介绍的几种形式来完满实现!

译文链接:https://www.infoworld.com/art…

更多高质量干货:参见我的 GitHub: csharptranslate

退出移动版