我越来越多地发现我的 ASP.NET MVC 视图需要一些逻辑来执行布局的情况。这些例程在我的模型或控制器中都没有位置。我有 3 个选项:
- 在视图中写入大量 <% %> 内联。
- 在多个局部视图中少写 <% %>。
- 编写一个 HtmlHelper 扩展方法。
这是让我困惑的最后一个选项。如果逻辑仅特定于一个视图,是否可以这样做?该扩展对所有其他视图的 Html 对象都是“可见的”,并且永远不需要它。
有什么建议么?
我越来越多地发现我的 ASP.NET MVC 视图需要一些逻辑来执行布局的情况。这些例程在我的模型或控制器中都没有位置。我有 3 个选项:
这是让我困惑的最后一个选项。如果逻辑仅特定于一个视图,是否可以这样做?该扩展对所有其他视图的 Html 对象都是“可见的”,并且永远不需要它。
有什么建议么?
我个人更喜欢选项 3(“编写 HtmlHelper 扩展方法”),因为这些代码体很容易进行单元测试。
我真的希望扩展方法可以放在内部或嵌套类上,因为你是对的,你将开始用大量只在一个视图中使用的扩展方法污染你的命名空间。
我建议将这些 HtmlHelper 扩展方法隔离在每个视图的自定义命名空间中的静态类中,您在视图中手动引用这些方法,以限制整个项目中可用的扩展方法的数量。
通常,我会将部分视图和扩展方法都限制为可重用组件,但我对此并不迂腐。如果您觉得其中任何一个都提高了代码的可读性,那么请继续使用它们。您可能希望为仅由一组视图使用的辅助方法考虑一个单独的命名空间/辅助类 - 有点像每个控制器分离您的部分。
您可能还想考虑使用更多的空格(即使它是沉默的杀手)来提高可读性。我已经在我的基本控制器中实现了输出压缩,以限制空白对下载时间的影响。
如果逻辑仅特定于一个视图,是否可以这样做?
是的。继续阅读...
该扩展对所有其他视图的 Html 对象都是“可见的”,并且永远不需要它。
没有真的。这取决于您如何为视图注册扩展方法。仅当您将命名空间添加到 web.config命名空间部分时才会出现这种情况。
如果要在单个视图上使用扩展方法,只需将其命名空间导入单个视图:
<%@ Import Namespace="NamespaceOf.Your.ExtensionMethods.ForThisViewOnly"%>