ASP.NET MVC的最佳实践

Best Practices for 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 Rashid的最佳实践(第1部分和第2部分)帖子非常有用,以及Maarten Balliauw的权势,但这些都有些干涸了,我希望从不同的人那里得到一个更加动态和不断增长的信息库,而不仅仅是来自有学问的个人的偶尔的博客条目。情人。像这样的信息很少,而且还远远不够,与ASP.NET MVC社区资源的差距甚至更小。

一般的MVC模型

随意添加模型链接

意见控制器

随意添加控制器链接

指南:

  • 每个答案一个"最佳实践"
  • 花点时间解释为什么它比其他选择更受欢迎。
  • 首先阅读现有的答案-如果你看到你同意的答案,请向上投票;如果你不同意,请向下投票,并留下解释原因的评论。
  • 如果你能扩展为什么它是"最好的",请随意编辑任何答案!

另外,请不要只写"菲尔·哈克、斯科特·古思里、罗伯·科尼或斯科特·汉斯曼的任何东西"!


使用t4mvc消除整个项目中的所有魔力字符串和魔力匿名类型。这将有助于您稍后在项目中重构,并且(除了必须仍然确保路由定义良好之外)所有操作调用都会得到它们的正确参数。它会像这样改变通话:

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

进入:

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


不要让任何逻辑出现在你的视野之外。您的控制器应该决定显示什么-您的视图应该是哑的。


  • 控制器工厂的IOC/DI(这样我就可以在控制器构造函数中注入IRepository、IsomeService)
  • 永远不要直接访问httpcontext,构建包装器,这样就可以对其进行单元测试。
  • 模型绑定验证的验证框架(xval或fluentvalidation)。MVC 1内部的内置验证是基本的
  • 不要使用"魔法字符串":用于从视图调用控制器/操作,用于RouteLink、renderPartial、renderAction,…
  • 不要使用VIEWDATA,将DTO生成到VIEWModel类。使用automapper将数据从域实体映射到视图模型DTO对象
  • 视图模型DTO对象:BaseViewModel抽象类,具有用于呈现页面元数据、菜单和每页上显示的所有其他内容的属性。所有其他ViewModel类都继承自BaseViewModel。


    尽可能保持你的控制器"薄"。只需让他们验证来自表单的数据,然后调用模型(完成所有实际工作),就可以在下一个视图中返回数据。

    拥有复杂的控制器有点打破了MVC的概念。


    "MVC in action"一书有两个免费章节。

    http://www.manning.com/palermong/

    第12章是最佳实践。


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

    http://www.codeplex.com/mvcontrib


    这是我处理应用程序中所有下拉列表的方式,我想与您共享,因为我认为这是一种最佳实践:

    为ASP.NET MVC中的所有DropDownList提供一个editorTemplate