ASP.NET MVC的最佳实践

30
基本上,这个“问题”旨在汇集社区中最佳实践的信息。这样做的原因是:
  • 缺乏基于社区的 ASP.NET MVC 最佳实践资源。是的,我知道 wiki.asp.net。
  • 我痛苦地意识到 ASP.NET MVC 上的 ASP.NET wiki 资源非常小,并且非常过时,需要 Microsoft 更多地完善它,然后再由社区进行处理。
  • 我对最佳实践非常感兴趣,因为在过去一年里,我有相当多的 ASP.NET MVC 经验,但我也意识到自己不是专家,可以肯定地改进。我相信,这篇文章可以帮助你和我。

我认真考虑了是否应该提出这个问题,甚至创建了一个question on meta关于创建这个问题。 :)

我正在寻找有关 ASP.NET MVC 的所有方面的最佳实践信息。控制器、模型、扩展、HTML 帮助程序、路由生成器、TDD。

过去,我发现像Kazi Manzur Rashid的最佳实践资源(第12部分)以及Maarten Balliauwweigh-in非常有用,但是这些资源已经有些干涸了,我希望能够获得一个更具活力和不断增长的信息库,来自不同人的信息,而不仅仅是来自学者的偶然博客文章。这样的信息很少,ASP.NET MVC社区资源更是如此。


MVC概述

模型(Model)

可以添加模型链接

视图(Views)

控制器(Controller)

可以添加控制器链接


指南:

  • 每个答案只包含一个"最佳实践"
  • 花时间解释为什么它应该优于其他选择。
  • 先阅读现有的答案 - 如果您同意某个答案,请投票支持;如果您不同意,请投票反对并留下评论解释原因。
  • 如有必要,可以编辑任何答案以扩展其"���佳性"的说明!

附言:请不要只写"Phil Haack, Scott Guthrie, Rob ConeryScott Hanselman的任何内容!


哦哦哦哦……不喜欢微软的家伙们。嘿嘿! - Kevin LaBranche
4
哈哈,我喜欢微软的人,但是有人可能会说:“哦,Gu写了一些圣经式的帖子,你应该去看看。” - Dan Atkinson
Kazi的博客中的这两个链接本身就值得点赞。我以前从未见过这些内容,但真希望早点看到,里面有非常非常好的建议! - Colin Desmond
7个回答

10
使用T4MVC在整个项目中消除所有的魔术字符串和匿名类型。 这将有助于您在项目后期进行重构,并且(除了仍需确保您的路由定义良好之外)所有Action调用都将获得其正确的参数。 它会更改像这样的调用:
<%= Html.ActionLink("Link text", "Products", "Details", new { id = Model.Id }) %>

进入:

<%= Html.ActionLink("Link text", MVC.Products.Details(Model.Id)) %>

这似乎对你帮助不大。此外,在我阅读的所有MVC书籍和访问的网站中,这是我第一次看到这个... - Martin
展望未来,ASP.NET MVC v2将使用强类型控件,如ActionLink。 - Dan Atkinson
@Martin,如果你在许多视图中散布这些调用,使用Resharper或其他重构工具将捕获这些调用,这非常有帮助,可以节省大量时间和头痛。@Dan,是的,但在预览1中还没有发现任何东西。 - Jason
这似乎最主要的好处是工具支持的重构/重命名。如果你使用工具将ProductsController.Details更改为ProductsController.Examine(!?),那么第二种情况就会自动处理,而在第一种情况下,您需要手动更改每个实例。 - Colin Desmond

7
  1. 控制器工厂中的IoC/DI(这样我就可以在控制器构造函数中注入IRepository、ISomeService)
  2. 永远不要直接访问HttpContext,建立包装器,以便进行单元测试
  3. 模型绑定验证的验证框架(xVal或FluentValidation)。MVC 1内置的验证是基本的
  4. 永远不要使用“魔法字符串”:用于从视图调用控制器/操作、RouteLink、RenderPartial、RenderAction等
  5. 永远不要使用ViewData,建立DTO ViewModel类。使用AutoMapper将数据从域实体映射到ViewModel DTO对象,以供视图使用

ViewModel DTO对象:
BaseViewModel抽象类,带有呈现页面元数据、菜单和所有出现在每个页面上的其他内容的属性。所有其他ViewModel类都继承自BaseViewModel。


1
抱歉我没有在每个答案中都放置一个最佳实践,我无法选择其中一个 ;) - Hrvoje Hudo
2
你本可以写五个单独的答案。 - Jan Aagaard
如果可能的话,您能提供这些的示例或先前的成果吗? - Dan Atkinson
我不相信在任何应用程序中都不使用ViewData是实际的。例如,主页面及其部分视图。除非有更好的解决方案? - Dan Atkinson
@jan:我认为在SO中最佳实践是只有一个答案,每个人都可以编辑和改进。 - Hrvoje Hudo

7

在视图中不要包含任何逻辑。你的控制器应该决定展示什么,而视图应该保持简单。


我认为一些逻辑是可以接受/不可避免的。例如... <% if(Request.IsAuthenticated) { %>注销<% } else { %>登录<% } %>。把它放在其他地方,比如一个辅助函数,也没有更好。 - Dan Atkinson
5
@Dan Atkinson - 实际上,我会放置<% if (Foo.ShowLogout) {%>注销<%}%> - 为什么要在视图中依赖请求?如果您正在测试中呈现它会怎样? - orip

3

虽然不是最佳实践网站,但下面的网站在asp.net MVC方面做了很多好事情,这些内容可能被认为是最佳实践。

http://www.codeplex.com/MVCContrib


3

1
第12章是免费章节之一吗? - Dan Atkinson
1
是的...在下载中 -> 示例章节12... - Martin

3

尽可能使您的控制器“瘦”一些。只需验证来自表单的数据,然后调用模型(执行所有实际工作)以获取要在下一个视图中返回的数据即可。

拥有复杂的控制器会破坏MVC概念。


1

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