ASP.NET MVC的最佳实践

时间:2009-08-23 00:40:14

标签: asp.net-mvc

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

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

我对是否应该提出这个问题进行了认真考虑,甚至还要创建question on meta来创建这个问题。 :)

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

过去,我发现资源,例如Kazi Manzur Rashid的最佳做法(部分12)非常有用,以及Maarten Balliauwweigh-in,但这些已经枯竭了,我希望能够从不同的人那里获得更有活力和不断增长的信息库,而不仅仅是偶尔从有学问的人那里获取博客。像这样的信息很少,而ASP.NET MVC社区资源则更少。


MVC一般

模型

随意添加模型链接

视图

控制器

随意添加控制器链接


指南:

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

P.S。请不要只是按“Phil HaackScott GuthrieRob ConeryScott Hanselman”添加“任何内容”!

7 个答案:

答案 0 :(得分:10)

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

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

分为:

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

答案 1 :(得分: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对象
  6. ViewModel DTO对象:
    BaseViewModel抽象类,具有呈现页面元数据,菜单和每个页面上显示的所有其他内容的属性。所有其他ViewModel类都继承自BaseViewModel。

答案 2 :(得分:7)

将任何和所有逻辑排除在您的视野之外。你的控制器应该确定显示的内容 - 你的观点应该是愚蠢的。

答案 3 :(得分:3)

虽然不是最佳实践网站,但以下网站使用asp.net MVC做得很好,可能被认为是最佳做法。

http://www.codeplex.com/MVCContrib

答案 4 :(得分:3)

“MVC in Action”一书有2个免费章节。

http://www.manning.com/palermo/

第12章是最佳实践。

答案 5 :(得分:3)

让您的控制器尽可能“瘦”。只需让它们验证来自表单的数据,然后调用模型(完成所有实际工作)即可在下一个View中返回数据。

让复杂的控制器破坏了MVC的概念。

答案 6 :(得分:1)

这就是我在我的应用程序中处理所有DropDowns的方式,我想与你分享,因为我认为这是最佳实践:

One EditorTemplate for all DropDownLists in ASP.Net MVC