ASP.NET MVC与RAILS3的比较
进入后Web年代之后,MVC框架进入了快速演化的时代,Struts等垂垂老矣的老一代MVC框架因为开发效率低下而逐渐被抛弃,新一代的MVC则高举敏捷的大旗,逐渐占领市场,其中的代表有Rails (ruby), .NET MVC (.NET), Django (Python),Symfony (PHP)等等,这些框架的思想都大同小异,这里列举出Rails3和.NET MVC的一些的区别,以方便Web开发者从Rails迁移到.NET MVC,或者反之,从.NET MVC迁移到Rails.
生成项目
Rails和.NET MVC都能够产生项目的基本骨架,只是生成的方式略有不同,Rails采用的是命令行的方式:
- rails tapir
而Microsoft则秉承其强大的IDE,提供了项目向导。
最终得到的目录结构,仅在测试和配置项上略有不同。
Rails | ASP.NET MVC |
/app/models | /Models |
/app/controllers | /Controllers |
/app/views | /Views |
/public/javascript | /Scripts |
/public | /Content |
/db | /App_Data |
/test | 单独的VS项目 |
/config | /Global.asax, /Properties, Web.config |
值得一提的是rails的一个亮点:rails可以预先配置三个不同的环境:开发、测试、最终产品,可以通过RAILS_ENV这个环境变量来做简单切换,.NET MVC并未提供这样的配置环境,你可以通过手工配置来完成。
模型Model
Rails默认采用ActiveRecord作为模型,当然切换到其他的框架也很简单,可选项有 Neo4J, MongoDB,和DataMapper。在Rails中,还是采用命令行来创建模型,Rails会生成一些骨架代码,包括:模型、迁移任务和测试。你可以用-o来选择其他模型、-t来选择其他测试框架:
- $ rails g model customer name:string email:string
- invoke active_record
- create db/migrate/20100419094010_create_customers.rb
- create app/models/customer.rb
- invoke test_unit
- create test/unit/customer_test.rb
- create test/fixtures/customers.yml
Rails默认采用Sqlite3作为后台数据库,而且Rails会很贴心的为开发、测试、生产三个环境分别产生一个数据库拷贝。
在Rails中,所有的数据库的操作都通过脚本和迁移来完成,Rails中的迁移应该是最有价值的一个东西,当不同的开发者同时在修改一个数据库,或者您在升级现有的生产环境下的数据库,迁移就显示出它的强大威力:
- class CreateCustomers < ActiveRecord::Migration
- # Called when migrating up to this version
- def self.up
- create_table :customers do |t|
- t.string :name
- t.string :email
- t.timestamps
- end
- end
- # Called when migrating down from this version
- def self.down
- drop_table :customers
- end
- end
我们可以通过rake db:migrate命令迁移到不同的数据库版本上去。
和Rails不同的是,.NET MVC并为绑定一个模型框架,你要从既有的框架中选择一个适合你的,这个名单里可以用Nhibernate,Linq to SQL, Entity Framework,Castle ActiveRecord或者Ruby的ActiveRecord,不过.NET MVC没有迁移的概念,这有点遗憾。
大部分情况下Linq To SQL就很适合项目开发。
查询语言
Rails3使用AREL(Active Record Relations),LINQ-to-SQL则使用LINQ。 二者都是相当优美的语言
- # A simple query with AREL
- User.where(users[:name].eq('Anders')).order('users.id DESC').limit(20)
- // The same with C#
- // Lambda Syntax
- db.Users.where(u => u.Name == "Anders").orderBy(u => u.Id).Take(20)
- // LINQ Syntax
- (from u in db.Users
- where u.Name == "Anders"
- orderby u.Id descending
- select u).Take(20);
现在除了在.NET中采用Ruby的ActiveRecord(借助ironruby),目前还没有其他框架提供类似Ruby的findbyXXX的功能,不过C# 4.0的method_missing使得这类框架应该会很快出现(比如Nhibernate 3.0)
控制器
在.NET MVC中,你在Controller目录上点添加,就有很贴心的向导引导你为项目添加控制器,甚至还可以增加基本的CRUD的功能。
- public class CustomersController : Controller {
- // GET: /Customers/
- public ActionResult Index() {
- return View();
- }
- // GET: /Customers/Details/5
- public ActionResult Details(int id) {
- return View();
- }
- // GET: /Customers/Create
- public ActionResult Create() {
- return View();
- }
- // POST: /Customers/Create
- [HttpPost]
- public ActionResult Create(FormCollection collection) {
- try {
- // TODO: Add insert logic here
- return RedirectToAction("Index");
- } catch {
- return View();
- }
- }
- }
和Rails的脚手架代码一样,这些最基本的代码99%会被废弃,但是提供了“让程序跑起来看看”的基础。
Rails还是通过命令行来为项目增加控制器,你还可以在命令行里制定为控制器生成哪些Action。
过滤器
Rails很容易为某个Action添加个过滤器
- class ItemsController < ApplicationController
- before_filter :require_user_admin, :only => [ :destroy, :update ]
- before_filter :require_user, :only => [ :new, :create]
- end
.NET也不含糊,只要重载OnActionExecuting就可以实现同样的功能:
- override void OnActionExecuting(ActionExecutingContext filterContext)
- {
- var action = filterContext.ActionDescriptor.ActionName;
- if (new List<string>{"Delete", "Edit"}.Contains(action)) {
- RequireUserAdmin();
- }
- if ("Create".Equals(action)) {
- RequireUserAdmin();
- }
- }
或者通过.NET的attribute更漂亮的完成
- [RequireUserAdmin("Delete", "Edit")]
- [RequireUser("Create")]
- public class CustomersController : Controller
路由
在Rails中,可以修改routes.rb来修改路由,默认的Rails的路由被配置成RESTful:
- Tapir::Application.routes.draw do |map|
- resources :animals
- get "customer/index"
- get "customer/create"
- match "/:year(/:month(/:day))" => "info#about",
- :constraints => { :year => /\d{4}/,
- :month => /\d{2}/,
- :day => /\d{2}/ }
- match "/secret" => "info#about",
- :constraints => { :user_agent => /Firefox/ }
- end
通过rake routes你可以快速查看路由的结果。
ASP.NET MVC的路由稍微复杂一些,不过同样强大:
- // Global.asax.cs
- public class MvcApplication : System.Web.HttpApplication {
- public static void RegisterRoutes(RouteCollection routes) {
- routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
- // Constrained route
- routes.MapRoute( "Product", "Product/{productId}",
- new {controller="Product", action="Details"},
- new {productId = @"\d+" } ); // Constraint
- // Route with custom constraint, defined below
- routes.MapRoute( "Admin", "Admin/{action}",
- new {controller="Admin"},
- new {isLocal=new LocalhostConstraint()} );
- }
- ...
- }
- public class LocalhostConstraint : IRouteConstraint {
- public bool Match ( HttpContextBase httpContext, Route route,
- string parameterName, RouteValueDictionary values,
- RouteDirection routeDirection )
- {
- return httpContext.Request.IsLocal;
- }
- }
View
二者在View上的表现十分接近,添加控制器的时候,会自动创建相应的视图,规则也类似:视图所在的文件夹以控制器的名字命名,视图的文件名则以控制器的action命令,二者也都提供了从某个模型创建脚手架视图的能力。
Partials
Rails和Asp.NET MVC都提供了在文件中包含部分HTML文件能力,ASP.NET MVC的文件采用ASP,而Rails默认是ERB或HAML.
- <!-- Rails -->
- <%= render 'form' %>
- <!-- ASP.NET MVC -->
- <% Html.RenderPartial("Form", Model);%>
.NET MVC 2中更做出了一些改进,提倡用2个替代的方法来产生代码:
- <%= DisplayFor("Address", m => m.Address ) %>
- <%= EditorFor("Address", m => m.Address ) %>
尾声
这篇文章对Rails和.NET MVC作了一个快速的浏览,目的是让有相应编程经验的程序员能快速了解另一个框架。无论Rails还是.NET MVC,都只是一个工具,一个好的程序员应该能随心摆弄他的工具,而不是被工具所摆布。
参考:
http://blog.jayway.com/2010/04/23/asp-net-mvc-vs-rails3/
ASP.NET MVC与RAILS3的比较的更多相关文章
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus
最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...
- 一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino
大半夜的,先说些废话提提神 如今智能家居已经不再停留在概念阶段,高大上的科技公司都已经推出了自己的部分或全套的智能家居解决方案,不过就目前的现状而言,大多还停留在展厅阶段,还没有广泛的推广起来,有人说 ...
- Asp.net MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合
今天为大家分享下 Asp.net MVC 将数据从前台传递到后台的几种方式. 环境:VS2013,MVC5.0框架 1.基本数据类型 我们常见有传递 int, string, bool, double ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第一章:创建基本的MVC Web站点
在这一章中,我们将学习如何使用基架快速搭建和运行一个简单的Microsoft ASP.NET MVC Web站点.在我们马上投入学习和编码之前,我们首先了解一些有关ASP.NET MVC和Entity ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之目录导航
ASP.NET MVC with Entity Framework and CSS是2016年出版的一本比较新的.关于ASP.NET MVC.EF以及CSS技术的图书,我将尝试着翻译本书以供日后查阅. ...
- ASP.NET MVC开发:Web项目开发必备知识点
最近加班加点完成一个Web项目,使用Asp.net MVC开发.很久以前接触的Asp.net开发还是Aspx形式,什么Razor引擎,什么MVC还是这次开发才明白,可以算是新手. 对新手而言,那进行A ...
- ASP.NET MVC原理
仅此一文让你明白ASP.NET MVC原理 ASP.NET MVC由以下两个核心组成部分构成: 一个名为UrlRoutingModule的自定义HttpModule,用来解析Controller与 ...
- ASP.NET MVC——模型绑定
这篇文章我们来讲讲模型绑定(Model Binding),其实在初步了解ASP.NET MVC之后,大家可能都会产生一个疑问,为什么URL片段最后会转换为例如int型或者其他类型的参数呢?这里就不得不 ...
随机推荐
- Delphi 泛型对象类
{ 很早就写了. 只针对delphixe 以上的版本可用. 希望不是自己在造轮子. } 1 unit U_ClassUtility; interface uses generics.defaults, ...
- LinearRegression
利用python实现简单的线性回归对房屋面积进行预测 # -*-coding:utf-8 -*- ''' Created on 2016年12月15日 @author: lpworkdstudy '' ...
- stm32f103 SPI单线TX发数据来驱动LCD
有一黑白LCD,有CS/SI/SCK三线,时序满足SPI时序,但STM32的SPI有四线NSS/MOSI/SCK/MISO,这里MISO没有用到.因此可以使用SPI的单线发送模式进行驱动LCD. 关键 ...
- [原创] PostgreSQL Plus Advanced Server在Windows中配置双机热备流复制
一.系统环境 操作系统:Windows Server 2003/2008 两个节点分别为master与slave. 主节点master:172.27.19.28 备机点slave:172.27.19. ...
- 修改linux端口范围 ip_local_port_range
tags: ip_local_port_range 端口范围 sysctl Linux中有限定端口的使用范围,如果我要为我的程序预留某些端口,那么我需要控制这个端口范围, 本文主要描述如何去修改端口范 ...
- 关于ios极光推送server端注意的地方
今天试用了极光推送API 用它是因为,大多数人说它的文档是最全的,但是用过之后,发现关于IOS的文档,还是很不够,导致走了一点弯路! 特别是服务端的代码:https://github.com/jpus ...
- 通过firefox+ProxySelector+dtunnel_lite实现代理上网
通过firefox+ProxySelector+dtunnel_lite实现代理上网 dtunnel_lite:http://dog-tunnel.tk/下载lite版本就可以 远端:./dtunne ...
- POC - ASP.NET & IIS 部分
终于得到了我VM的管理员权限啦啦.接下来不需要把IIS架在我自己的电脑上了,将架在我的VM上. 1. 先添加ISAP和CGI的组件. 2. 将defaultAppPool的MODE设为CLASSIC, ...
- 64位Windows2003下如何正确发布VesnData.Net(VDN)
64位windows2003下发布VDN,按照正常的步骤会出现:试图加载格式不正确的程序. (异常来自 HRESULT:0x8007000B)的错误. 按照下面的步骤进行处理: 1.如果安装了64位F ...
- VS2010在C#头文件中添加文件注释的方法
步骤: 1.VS2010 中找到安装盘符(本人安装目录在D盘,所以以D盘为例)D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\I ...