如何在 Visual Studio 中查找 MVC 控制器方法的引用
How find references for MVC controller methods in Visual Studio
经过长期的 WebForms 开发,我最近开始使用 MVC。让我印象深刻的一件事是,由于控制器方法不是直接从代码调用的,Visual Studio 不会获取对它们的任何引用。
我理解没有引用计数的原因,但有时会出现问题。假设我重写了一个控制器方法来满足一些新的要求,也许对该方法的某个调用需要额外的数据或修改的结果。但也许那个方法,或者端点,如果你愿意的话,是从几个地方调用的,我所做的改变打破了对那些其他调用的结果处理。我希望能够轻松找到我的解决方案中的所有代码,这些代码将调用端点。
目前我倾向于复制方法名称并在整个解决方案中执行常规文本搜索,只要方法名称不太通用,这种方法就可以很好地工作。如果方法名称是"Index",那可能是漫长的一天。
是否有任何关于如何简化这一点的建议,例如编码约定、插件或其他方式? I.E.我如何定位调用端点的位置?
我目前使用 Visual Studio 2017 Enterprise,但最好也使用其他版本的解决方案 - 使答案对尽可能多的人有用。
在此先感谢/Culme
更新:根据收到的评论和回复,我学到了很多东西。除了下面提到的内容之外,我还决定尝试让我的控制器方法名称保持唯一且可识别,以简化查找它们的使用位置。例如,我将尝试使用 "Fidgets_IndexController" 或类似的东西,而不仅仅是 "Index"。这样,简单的文本搜索将大大有助于查找调用代码。
控制器方法没有直接从代码的任何部分引用(因此引用为 0),但它们是基于 RouteTable 动态调用的,该 RouteTable 在启动时映射控制器方法 RouteConfig.RegisterRoutes(RouteTable.Routes);
in global.asax "implicitly" 会将它们映射为 /controller_name/action_name 或者可以通过编辑来更改它们
RouteConfig.RegisterRoutes(RouteCollection routes)
或使用属性:
[Route("myAction")]
public ActionResult MyAction() {
...
}
这会将它绑定到 /myAction(没有控制器名称)
延伸阅读:
MSDN - Understanding MVC Application Execution Process
其中一个选项是 Resharper - 它或多或少可以确定您在哪里使用指向控制器操作的 Html.ActionLink()
或 Html.BeginForm()
。但它不会检测到任何由 JS 完成的 posts/redirects。
您还可以做的另一件事是使用 T4MVC 使来自视图的链接静态类型化,这样您就可以搜索引用。
通过解决方案进行文本搜索会有所帮助,但并不像您已经发现的那样总是那么好 - 在一个普通的 MVC 项目中,您有多少对字符串 Index
的引用?所以这将有助于独特的 controller/action 名称,但对通用名称没有帮助。
除此之外,您只能靠自己了。如果你尝试做一些聪明的事情,比如在 JS 中连接字符串来给你正确的端点——你就有麻烦了。
如果您非常了解该应用程序,则另一种选择。在控制器操作上放置一个断点,然后 运行 对应用程序进行一些测试。
经过长期的 WebForms 开发,我最近开始使用 MVC。让我印象深刻的一件事是,由于控制器方法不是直接从代码调用的,Visual Studio 不会获取对它们的任何引用。
我理解没有引用计数的原因,但有时会出现问题。假设我重写了一个控制器方法来满足一些新的要求,也许对该方法的某个调用需要额外的数据或修改的结果。但也许那个方法,或者端点,如果你愿意的话,是从几个地方调用的,我所做的改变打破了对那些其他调用的结果处理。我希望能够轻松找到我的解决方案中的所有代码,这些代码将调用端点。
目前我倾向于复制方法名称并在整个解决方案中执行常规文本搜索,只要方法名称不太通用,这种方法就可以很好地工作。如果方法名称是"Index",那可能是漫长的一天。
是否有任何关于如何简化这一点的建议,例如编码约定、插件或其他方式? I.E.我如何定位调用端点的位置?
我目前使用 Visual Studio 2017 Enterprise,但最好也使用其他版本的解决方案 - 使答案对尽可能多的人有用。 在此先感谢/Culme
更新:根据收到的评论和回复,我学到了很多东西。除了下面提到的内容之外,我还决定尝试让我的控制器方法名称保持唯一且可识别,以简化查找它们的使用位置。例如,我将尝试使用 "Fidgets_IndexController" 或类似的东西,而不仅仅是 "Index"。这样,简单的文本搜索将大大有助于查找调用代码。
控制器方法没有直接从代码的任何部分引用(因此引用为 0),但它们是基于 RouteTable 动态调用的,该 RouteTable 在启动时映射控制器方法 RouteConfig.RegisterRoutes(RouteTable.Routes);
in global.asax "implicitly" 会将它们映射为 /controller_name/action_name 或者可以通过编辑来更改它们
RouteConfig.RegisterRoutes(RouteCollection routes)
或使用属性:
[Route("myAction")]
public ActionResult MyAction() {
...
}
这会将它绑定到 /myAction(没有控制器名称)
延伸阅读:
MSDN - Understanding MVC Application Execution Process
其中一个选项是 Resharper - 它或多或少可以确定您在哪里使用指向控制器操作的 Html.ActionLink()
或 Html.BeginForm()
。但它不会检测到任何由 JS 完成的 posts/redirects。
您还可以做的另一件事是使用 T4MVC 使来自视图的链接静态类型化,这样您就可以搜索引用。
通过解决方案进行文本搜索会有所帮助,但并不像您已经发现的那样总是那么好 - 在一个普通的 MVC 项目中,您有多少对字符串 Index
的引用?所以这将有助于独特的 controller/action 名称,但对通用名称没有帮助。
除此之外,您只能靠自己了。如果你尝试做一些聪明的事情,比如在 JS 中连接字符串来给你正确的端点——你就有麻烦了。
如果您非常了解该应用程序,则另一种选择。在控制器操作上放置一个断点,然后 运行 对应用程序进行一些测试。