ASP.NET MVC是如何解决这个问题的?

5

为什么我可以在控制器中创建一个方法,只需放置一些参数,点击表单提交后,它就能自动识别出来呢?在内部,它是如何找到正确的方法并确定我只需要这些参数的呢?

2个回答

8
简而言之:
1.路由引擎处理 HttpRequest,并检查请求的 URL。当它找到第一个路由匹配时,它会创建 MvcRouteHandler 的新实例,并将 URL 中分解的标记传递给它的 RouteValueDictionary。
2.路由的 MvcRouteHandler 接受请求,尝试实例化控制器类实例。按照约定,它寻找一个名为 "XXXXXXController" 的类,在路由中,X 被替换为 {controller} 参数。
3.一旦找到控制器,它调用方法,该方法由路由中的 {action} 参数指定。在路由中存在的任何命名参数,例如 {id},都作为参数传递给该方法。
基本上,ASP.Net MVC“知道”的所有内容都来自路由信息。它无法从空气中推测出参数 - 它们必须来自路由解析。如果请求的 URL 中不存在信息,则无法将其传递到方法中。
还应注意,您可以通过使路由使用不同于 MvcRouteHandler 的替代处理程序来覆盖框架的行为。该框架是非常可扩展的,因此您可以在许多点插入自定义功能。

从路由或表单字段集合中获取。 - GalacticCowboy
表单字段集合随请求一起传递,但它并不影响ASP.Net MVC的运作方式。该表单被提交到指定的URL(通常是生成视图的同一控制器),该URL由路由引擎处理。 - womp

1

控制器、操作和视图的解析以及 ModelBinders 都涉及到相当多的代码。因此,最好您应该查看框架的特定部分并提出更详细的问题,以获取更好的答案。

幸运的是,ASP.NET MVC framework 已经开源, 因此如果你想了解它的全部工作原理,你可以获取代码并自己进行研究。这是一份非常好的代码,您肯定会从中学到很多东西。

然而,更重要的是,您应该查看 System.Web.Mvc.MvcHandler 和 System.Web.Mvc.ControllerActionInvoker 类,这将帮助您找到正确的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接