100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 如何在 ASP.NET Core MVC 5 中处理未知的 Action

如何在 ASP.NET Core MVC 5 中处理未知的 Action

时间:2020-11-02 11:51:20

相关推荐

如何在 ASP.NET Core MVC 5 中处理未知的 Action

Core MVC 5 是一个轻量级,开源的,利于单元测试的基于 Core 运行时的 web 框架,在开发时你肯定会遇到不少那些 request 无法匹配 Action 的情况,通常做法是抛出 404,但有些场景下我希望能收口到统一一个 Action 去执行,这篇文章我们将会讨论如何去处理那些未知 Action 的收口。

创建 Controller

现在我们创建一个 AuthorController 类,如下代码所示:

publicclassAuthorController:Controller{[HttpGet]publicActionResultIndex(){returnView();}}

未知 Action 的问题

先抛出问题,然后再来看一下怎么解决,假设现在在做一个图书搜索系统,你希望用户可以根据作者名书名,文章标题等条件去查询图书信息,首先你需要知道目录所包含的所有作者,书籍,文章的详细信息,那么这个需求怎么实现呢?

为了实现需求,我肯定会先在 Views 文件夹下新增对应的 view 文件,比如Authors.cshtml, Books.cshtml, Articles.cshtml,方便用户查询时导向各自的 view ,比如下面的请求。

/Author/Books/Author/Articles

显而易见下面的 url 它可以非常利索的导向 AuthorController 下的 Index 方法。

/Author/Index

回过头来,如果你在浏览器中输入如下两个url,这时候肯定会抛异常,很显然 AuthorControler 下并没有所谓的 Books 和 Articles 这两个 Action 方法。

/Author/Books/Author/Articles

使用 routing 处理未知 Action

那如何对这些未知 Action 进行收口呢?可以使用Routing机制来解决此类问题,如下代码所示:

publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){app.UseStaticFiles();app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints=>{endpoints.MapControllerRoute(name:"viewName",pattern:"{controller}/{*viewName}",defaults:new{action="DisplayAnyView"});});}

上面代码的意思是,使用视图名 (*viewName) 来匹配 Action,如果能找到对应的 Action 则可以进行渲染,如何找不到就默认跳到DisplayAnyView这个Action上,下面是 DisplayAnyView 方法的实现。

publicIActionResultDisplayAnyView(stringviewName){returnView(viewName);}

完整的 AuthorController 代码如下:

publicclassAuthorController:Controller{[HttpGet]publicActionResultIndex(){returnView();}publicIActionResultDisplayAnyView(stringviewName){returnView(viewName);}}

接下来把程序跑起来后,输入:http://localhost:32172/Author/Books, 你会观察到 DisplayAnyView 方法中的断点被成功命中,如下图所示:

Action 是 Controller 下的 public & non-static 方法,它可以有效的将 request 请求匹配到对应的 action 上,然而当 request 所匹配的 action 不存在时将会抛出运行时异常,现在你可以避免这种情况了。

译文链接:/article/3600794/how-to-handle-unknown-actions-in-aspnet-core-mvc-5.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。