ASP.NET MVC的最佳实践

Dan*_*son 30 asp.net-mvc

基本上,这个"问题"旨在汇集有关社区最佳实践的信息.原因是:

  • 缺乏基于社区的ASP.NET MVC资源以获得最佳实践.是的,我知道wiki.asp.net.
  • 我很痛苦地意识到ASP.NET MVC上的ASP.NET wiki非常小而且非常过时,并且在社区对它做任何事情之前需要微软充实.
  • 我对一般的最佳实践非常感兴趣,去年在ASP.NET MVC方面有相当程度的经验,但我也注意到我不是专家,而且我肯定能够提高.我相信这篇文章可以帮到你,而你.

我对是否应该问这个问题进行了一些认真的思考,甚至​​在创建关于创建这个问题的meta问题上花了很长时间.:)

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

在过去,我发现资源,例如Kazi Manzur Ra​​shid的最佳实践(第1部分和第2部分)非常有用,以及Maarten Balliauw称重,但这些资源已经枯竭,我希望来自不同人的更有活力和不断增长的信息库,而不仅仅是来自学习者的偶尔博客.像这样的信息很少,而且ASP.NET MVC社区资源更是如此.


MVC一般

模型

随意添加模型链接

查看

调节器

随意添加控制器链接


指南:

  • 每个答案一个"最佳实践"
  • 花点时间解释为什么它应该优先于替代品.
  • 首先阅读现有答案 - 如果你看到一个你同意的答案,那就投票吧; 如果您不同意,请投票并留下评论解释原因.
  • 如果您可以扩展为什么它是"最好的",请随意编辑任何答案!

PS请不要只放" Phil Haack,Scott Guthrie,Rob ConeryScott Hanselman的任何东西"!

Jas*_*son 10

使用T4MVC消除整个项目中的所有魔术字符串和魔术匿名类型.这将帮助您稍后在项目中进行重构,并且(除了必须确保您的路由定义良好之外)所有Action调用都会获得正确的参数.它改变了这样的调用:

<%= Html.ActionLink("Link text", "Products", "Details", new { id = Model.Id }) %>
Run Code Online (Sandbox Code Playgroud)

成:

<%= Html.ActionLink("Link text", MVC.Products.Details(Model.Id)) %>
Run Code Online (Sandbox Code Playgroud)


Hrv*_*udo 7

  1. 控制器工厂的IoC/DI(所以我可以在控制器构造函数中注入IRepository,ISomeService)
  2. 从不直接访问HttpContext,构建包装器,因此可以进行单元测试
  3. 模型绑定验证的验证框架(xVal或FluentValidation).MVC 1内置的验证是基本的
  4. 从不使用"魔术字符串":用于从View调用控制器/操作,用于RouteLink,RenderPartial,RenderAction,......
  5. 从不使用ViewData,构建DTO ViewModel类.使用AutoMapper将数据从域实体映射到View的ViewModel DTO对象

ViewModel DTO对象:
BaseViewModel抽象类,具有呈现页面元数据,菜单和每个页面上显示的所有其他内容的属性.所有其他ViewModel类都继承自BaseViewModel.

  • 你可以写出五个单独的答案. (2认同)

Mun*_*PhD 7

保持你的观点不受任何和所有逻辑的影响.你的控制器应该确定显示的内容 - 你的观点应该是愚蠢的.

  • @Dan Atkinson - 实际上,我将<%if(Foo.ShowLogout){%>注销<%}%>改为 - 为什么要依赖视图中的请求?如果你在测试中渲染它怎么办? (5认同)

Kev*_*che 3

虽然不是最佳实践站点,但下面的站点使用 ASP.NET MVC 做了很多很棒的事情,这可能被认为是最佳实践。

http://www.codeplex.com/MVCContrib