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采用的是命令行的方式:

Java代码  

  1. 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来选择其他测试框架:

Java代码  

  1. $ rails g model customer name:string email:string
  2. invoke  active_record
  3. create    db/migrate/20100419094010_create_customers.rb
  4. create    app/models/customer.rb
  5. invoke    test_unit
  6. create      test/unit/customer_test.rb
  7. create      test/fixtures/customers.yml

Rails默认采用Sqlite3作为后台数据库,而且Rails会很贴心的为开发、测试、生产三个环境分别产生一个数据库拷贝。

在Rails中,所有的数据库的操作都通过脚本和迁移来完成,Rails中的迁移应该是最有价值的一个东西,当不同的开发者同时在修改一个数据库,或者您在升级现有的生产环境下的数据库,迁移就显示出它的强大威力:

Java代码  

  1. class CreateCustomers < ActiveRecord::Migration
  2. # Called when migrating up to this version
  3. def self.up
  4. create_table :customers do |t|
  5. t.string :name
  6. t.string :email
  7. t.timestamps
  8. end
  9. end
  10. # Called when migrating down from this version
  11. def self.down
  12. drop_table :customers
  13. end
  14. 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。 二者都是相当优美的语言

Java代码  

  1. # A simple query with AREL
  2. User.where(users[:name].eq(‘Anders‘)).order(‘users.id DESC‘).limit(20)

Java代码  

  1. // The same with C#
  2. // Lambda Syntax
  3. db.Users.where(u => u.Name == "Anders").orderBy(u => u.Id).Take(20)
  4. // LINQ Syntax
  5. (from u in db.Users
  6. where u.Name == "Anders"
  7. orderby u.Id descending
  8. select u).Take(20);

现在除了在.NET中采用Ruby的ActiveRecord(借助ironruby),目前还没有其他框架提供类似Ruby的findbyXXX的功能,不过C# 4.0的method_missing使得这类框架应该会很快出现(比如Nhibernate 3.0)

控制器 
在.NET MVC中,你在Controller目录上点添加,就有很贴心的向导引导你为项目添加控制器,甚至还可以增加基本的CRUD的功能。

Java代码  

  1. public class CustomersController : Controller {
  2. // GET: /Customers/
  3. public ActionResult Index() {
  4. return View();
  5. }
  6. // GET: /Customers/Details/5
  7. public ActionResult Details(int id) {
  8. return View();
  9. }
  10. // GET: /Customers/Create
  11. public ActionResult Create() {
  12. return View();
  13. }
  14. // POST: /Customers/Create
  15. [HttpPost]
  16. public ActionResult Create(FormCollection collection) {
  17. try {
  18. // TODO: Add insert logic here
  19. return RedirectToAction("Index");
  20. } catch {
  21. return View();
  22. }
  23. }
  24. }

和Rails的脚手架代码一样,这些最基本的代码99%会被废弃,但是提供了“让程序跑起来看看”的基础。

Rails还是通过命令行来为项目增加控制器,你还可以在命令行里制定为控制器生成哪些Action。

过滤器 
Rails很容易为某个Action添加个过滤器

Java代码  

  1. class ItemsController < ApplicationController
  2. before_filter :require_user_admin, :only => [ :destroy, :update ]
  3. before_filter :require_user, :only => [ :new, :create]
  4. end

.NET也不含糊,只要重载OnActionExecuting就可以实现同样的功能:

Java代码  

  1. override void OnActionExecuting(ActionExecutingContext filterContext)
  2. {
  3. var action = filterContext.ActionDescriptor.ActionName;
  4. if (new List<string>{"Delete", "Edit"}.Contains(action)) {
  5. RequireUserAdmin();
  6. }
  7. if ("Create".Equals(action)) {
  8. RequireUserAdmin();
  9. }
  10. }

或者通过.NET的attribute更漂亮的完成

Java代码  

  1. [RequireUserAdmin("Delete", "Edit")]
  2. [RequireUser("Create")]
  3. public class CustomersController : Controller

路由 
在Rails中,可以修改routes.rb来修改路由,默认的Rails的路由被配置成RESTful:

Java代码  

  1. Tapir::Application.routes.draw do |map|
  2. resources :animals
  3. get "customer/index"
  4. get "customer/create"
  5. match "/:year(/:month(/:day))" => "info#about",
  6. :constraints => { :year => /\d{4}/,
  7. :month => /\d{2}/,
  8. :day => /\d{2}/ }
  9. match "/secret" => "info#about",
  10. :constraints => { :user_agent => /Firefox/ }
  11. end

通过rake routes你可以快速查看路由的结果。

ASP.NET MVC的路由稍微复杂一些,不过同样强大:

Java代码  

  1. // Global.asax.cs
  2. public class MvcApplication : System.Web.HttpApplication {
  3. public static void RegisterRoutes(RouteCollection routes) {
  4. routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  5. // Constrained route
  6. routes.MapRoute( "Product", "Product/{productId}",
  7. new {controller="Product", action="Details"},
  8. new {productId = @"\d+" } ); // Constraint
  9. // Route with custom constraint, defined below
  10. routes.MapRoute( "Admin", "Admin/{action}",
  11. new {controller="Admin"},
  12. new {isLocal=new LocalhostConstraint()} );
  13. }
  14. ...
  15. }
  16. public class LocalhostConstraint : IRouteConstraint {
  17. public bool Match ( HttpContextBase httpContext, Route route,
  18. string parameterName, RouteValueDictionary values,
  19. RouteDirection routeDirection )
  20. {
  21. return httpContext.Request.IsLocal;
  22. }
  23. }

View 
二者在View上的表现十分接近,添加控制器的时候,会自动创建相应的视图,规则也类似:视图所在的文件夹以控制器的名字命名,视图的文件名则以控制器的action命令,二者也都提供了从某个模型创建脚手架视图的能力。

Partials 
Rails和Asp.NET MVC都提供了在文件中包含部分HTML文件能力,ASP.NET MVC的文件采用ASP,而Rails默认是ERB或HAML.

Java代码  

  1. <!-- Rails -->
  2. <%= render ‘form‘ %>

Java代码  

  1. <!-- ASP.NET MVC -->
  2. <% Html.RenderPartial("Form", Model);%>

.NET MVC 2中更做出了一些改进,提倡用2个替代的方法来产生代码:

Java代码  

  1. <%= DisplayFor("Address", m => m.Address ) %>
  2. <%= 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的比较,布布扣,bubuko.com

时间: 2024-08-02 17:41:31

ASP.NET MVC与RAILS3的比较的相关文章

ASP.NET MVC 使用Remote特性实现远程属性验证

RemoteAttribute是asp.net mvc 的一个验证特性,它位于System.Web.Mvc命名空间 下面通过例子来说明 很多系统中都有会员这个功能,会员在前台注册时,用户名不能与现有的用户名重复,还要求输入手机号码去注册,同时手机号码也需要验证是否重复,下面是实体类 /// <summary> /// 会员 /// </summary> public class Member { public int Id { get; set; } [Required(Error

95后实习生的远程办公体验(asp.net mvc\C#技术栈)

这个月我们做了一件别人看起来很疯狂的事情,就是让一批95后的实习生实行远程办公,效果还不错,于是写此文总结一下. 其实认真算算,我自己的远程工作经验有十年了吧,在北京工作的时候天气不好就申请在家办公,在硅谷的时候每周有三天在家办公,两天去办公室办公.所以我也算得上是远程办公的老司机了吧. 不过,我之前都是对有多年工作经验的老司机才实行远程办公,还从来没有对还未毕业的实习生实行过.老实说,不敢啊,也不放心,况且我在cnblogs博客园呆了十年,还真没见过对还未毕业的实习生实行过远程办公的. 那为什

ASP.NET MVC 4入门

一.MVC设计模式将Web应用分解成三个部分:模型(Models).试图(Views)和控制器(Controllers),这三部分分别完成不同的功能以实现Web应用. 视图(View)代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML.XML和Applet.MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,不包括在视图上的业务流程的处理.业务流程的处理交予模型(Model)处理. 模型(Model)就是业务流程/状态的处理以及业务规则的制定

CRUD Operations In ASP.NET MVC 5 Using ADO.NET

Background After awesome response of an published by me in the year 2013: Insert, Update, Delete In GridView Using ASP.Net C#. It now has more than 140 K views, therefore to help beginners I decided to rewrite the article i with stepbystep approach u

ASP.NET MVC轻教程 Step By Step 6——改进表单

上一节我们使用原始的HTML表单来完成留言功能,但是ASP.NET MVC提供了丰富的HTML辅助方法来帮助我们构建更简洁优雅的表单. Step 1. 修改Form标签 首先,我们可以使用Html.BeginForm来创建form标签.这样我们可以将原来的表单改成如下代码. @{Html.BeginForm("Save", "Home"); } <label for="nickname">昵称</label> <in

ASP.NET MVC验证框架中关于属性标记的通用扩展方法

http://www.cnblogs.com/wlb/archive/2009/12/01/1614209.html 之前写过一篇文章<ASP.NET MVC中的验证>,唯一的遗憾就是在使用Data Annotation Validators方式验证的时候,如果数据库是Entityframework等自动生成的文件,就没有办法使用扩展属性标记进行标记.现在已经开始有了一些其它的Asp.net MVC 验证框架,使用上跟Data Annotation Validators差不太多,但是普遍有这样

快速构建ASP.NET MVC Admin主页

前言 后台开发人员一般不喜欢调样式,搞半天样式出不来,还要考虑各种浏览器兼容,费心费力不讨好,还好互联网时代有大量的资源共享,避免我们从零开始,现在就来看怎么快速构建一个ASP.NET MVC后台管理admin主页的方法,先看一看最终的效果! 第一步:选择一个合适的admin模板 互联网时代就是资源共享的时代,网上各种前端模板,这里主要是说明怎么把模板整合到我们的ASP.NET MVC项目中,至于模板大家可以自己去选择喜欢的,这里我们选择这个清爽版的AircraftAdmin,首先看看Aircr

ASP.NET MVC学习系列(二)-WebAPI请求

继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetU

[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序读取相关数据

这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第六篇:为ASP.NET MVC应用程序读取相关数据 原文:Reading Related Data with the Entity Framework in an ASP.NET MVC Application 译文版权所有,谢绝全文转载--但您可以在您的网站上添加到该教程的链接. 在之前的教程中您已经完成了学校数据模型.在本教程中你将