<译>12个asp.net MVC最佳实践

       上一周我我在罗马进行了两场对于开发完成不久的http://www.dotnetromacesta.org/的Asp.net MVC的演讲。而其中一场演讲内容是关于我对于Asp.net MVC最佳实践的看法.因为这场演讲是在意大利进行的,为了大家能更好的阅读,我将演讲所用的ppt翻译成英文。

     

关于Controller的最佳实践

1-删除AccountController

    让Demo代码在你的程序中是一个非常不好的做法。请永远不要使用AccountController.

2-隔离外部网络和Controller

     如果依赖HttpContext,数据访问类,配置,日志等,则会让程序难以测试,修改或者进一步开发。

3-使用一个IOC容器

    使达到第二条最佳实践更加容易,使用IOC容器管理所有外部依赖我使用 Ninject v2,这种IOC容器有很多,如果需要的话,你甚至可以自己实现一个。

4-和“神奇的strings”说不

    永远不要使用ViewData[“key”],而要为每一个视图创建一个ViewModel,从而使用强类型的ViewPage<ViewModel>.

    神奇的Strings是很邪恶的,因为你可能由于错误的拼写而导致视图出错,而强类型的Model不仅可以有智能感知,而且错误是在编译时获取而不是在运行时。

5-创建你自己的“个人惯例”

    使用Asp.net MVC作为你个人(或者公司)的参考构架的基础,你还可以使Controller和View继承于你自己的基类而不是默认的基类来让你的惯例更加透彻。

6-注意Verbs

    就算不使用最合适的HTTP Verb,最要也要采用PRG模式,(Post-Redirect-Get):使用Get来显示数据,使用Post来修改数据。

  

关于Model的最佳实践

7–DomainModel != ViewModel

     DomainModel代表着相应的域,但ViewModel却是为View的需要而创建。这两者之间或许(一般情况下都)是不同的,此外DomainModel是数据加上行为的组合体,是由复杂的变量类型组成的并且具有层次。而ViewModel只是由一些String等简单变量类型组成。如果想移除冗余并且容易导致出错的ORM代码,可以使用AutoMapper.如果想要了解更多,我推荐阅读:ASP.NET MVC View Model Patterns.

8-为“共享”的数据使用ActionFilter

     这是我自己的解决方案,或许需要在未来发帖继续探讨。通常情况下,你都不希望你的Controller获取的数据在几个不同的View之间共享,我的方法则是使用ActionFilter来获取在几个不同View之间共享的数据,然后用合适的View来显示。

关于View的最佳实践

9-不要使用CodeBehind模式

      永远不要。

10-尽可能的写HTML代码

      我认为Web开发人员必须的习惯于写HTML(或者CSS和JAVASCRIPT).所以最好少用仅仅用来隐藏HTML代码的HTMLHelper(比如HTML.Submit或者HTML.Button).这也是我会在未来的帖子里讨论的。

11-如果有if语句,使用HTMLHelper

      View必须是哑巴(Controller是瘦子而Model是胖子),如果你发现自己在使用if语句,那就写一个HTMLHelper来隐藏选择条件语句.

12-仔细的选择你的View引擎

     默认的引擎室WebFormViewEngine,IMHO并不是最好的引擎,我更倾向于选择Spark ViewEngine,因为对于我来说这个引擎更适合MVC的View.我喜欢的是“dominates the flow and that code should fit seamlessly”对于每一次循环来说IF语句都会被定义在”HTML标签“中.

DEMO代码和幻灯片的下载

     你可以下载幻灯片或者demo代码

 

 

 

 

原文链接:http://codeclimber.net.nz/archive/2009/10/27/12-asp.net-mvc-best-practices.aspx

posted @ 2009-10-31 23:19 CareySon 阅读(4128) 评论(14) 编辑 收藏

 回复 引用 查看   
#1楼 2009-10-31 23:48 Hafeyang      
不错。正在回味这里面的经验。
 回复 引用 查看   
#2楼 2009-11-01 01:03 Jeffrey Zhao      
不同意11,看了他的演示代码之后,更不同意了……
当然,我的意思是,要试情况而定。

 回复 引用 查看   
#3楼 2009-11-01 09:59 ︶ㄣ木べ头      
说的很好
 回复 引用   
#4楼 2009-11-01 10:00 f--&xy[未注册用户]
这些基本的东西就别放在首页了,也不知道是从那抄来的

 回复 引用 查看   
#5楼 2009-11-01 10:20 小-G      
@Jeffrey Zhao
<%
var rowIndex = 1;
foreach (Post post in Model.Posts) { %>
<li><a style="<%=Html.AlternateRowColor(rowIndex++, "Yellow") %>" href="Post/Page?PostId=<%= post.Id %>"><%= post.Title %></a></li>
<% } %>
看示例代码确实没多大必要弄个Helper,还不如直接:
(++rowIndex)%2==0?'#fff':'#000'
示例代码的其它部分做法也确实值得讨论,比如:拼凑的URL
其实我觉得把这段代码都用Helper来写更好一些,比如类似这样:
public static void OutputPosts(this HtmlHelper helper,
List<Post> posts,string rowClass,string alternateRowClass)
{...}
不过,我觉得11的意思是要视图中不要出现两份需要逻辑选择执行的代码,以利于界面开发人员更好的掌握页面机构,另外就是代码重用吧,所以我还是支持的

 回复 引用 查看   
#6楼 2009-11-01 22:39 蛙蛙王子      
我也不同意十一,我好几条儿都不同意,可能我写的比较少吧
我是新手,菜菜的问一句,第9条的意思,我不是很明白
 回复 引用   
#8楼 2009-11-02 15:37 @mvc[未注册用户]
我觉得真正项目中4很难完全做到啊!!即便做到了也肯定比较麻烦.....

 回复 引用 查看   
#9楼 2009-11-04 18:14 邀月      
学习!
 回复 引用 查看   
#10楼 2010-01-06 22:14 Aspgreener      
学习一下,有些说的还是不错的!~
-------------------------------------------------------------
专注于自己的网站,***(全新改版,欢迎捧场)

 回复 引用 查看   
#11楼 2010-03-18 23:37 撞破南墙      
@小-G

为了和写界面的分离

我觉得还是 尽量 少用 htmlhelper
不然 一打开 写前台的 需要打开 vs 调 html
自己看 从 设计 模式看 也不太 清晰。

 回复 引用 查看   
#12楼 2010-08-24 22:10 泪奔的老刘      
@新手菜鸟一个

意思就是说HTML和代码分离,是HTML+CS的形式,而不是*.ASPX+*.ASPX.CS的形式

 回复 引用 查看   
#13楼 2010-08-30 18:03 popzhou      
好,收藏了~
 回复 引用 查看   
#14楼 2010-10-29 08:33 鹤冲天      
先收藏,可能还没到作者的境界,部分暂时观点无法理解。
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1593731 MXiJXOdCDIc=