ASP.NET MVC可以做什么而Ruby on Rails不能做什么?[关闭]


37

ASP.NET MVC和Rails具有相似的使用领域,围绕相同的体系结构构建,这两个框架都是相对较新的开放源代码。

因此,作为一名Rails程序员,我想知道ASP.NET MVC可以做什么而Ruby on Rails不能做什么,反之亦然?


好问题。我是MVC开发人员,非常想知道答案。
StuperUser 2011年

14
这些类型的问题是开放式的,可以通过浏览网络恕我直言来更好地回答。现代索纳塔不能做到的宝马335可以做什么?他们都有4次尝试,一个方向盘,并且建立在相同的消费框架上;汽油。这些问题的出现是由于缺乏对给定主题的理解的研究,这可能会引发一个更直接的问题。...我敢肯定,由于这是程序员,所以很多人会不同意……
Aaron McIver

1
@Aaron-尽管我在为这个问题添加答案时遇到了麻烦,但我原则上同意您的观点,并且希望我明确表示要借用您的模拟产品,但我们仍在将一辆汽车与另一辆汽车进行比较。
亚当·克罗斯兰

10
我个人认为这是一个有效的问题。这样的问题不应该被轻易消除,因为我们中的许多人只知道故事的一面,也有助于了解另一面。顺便说一句,在StackExchange上提出一个问题,就等于在我的书中进行了研究。
Umar Farooq Khawaja

3
我经常问这样的问题,并把它们打倒,所以我想在这里为OP表示一些支持。编码时做出的决定几乎总是主观的。我的权利可能是您的错,而两者都可以开发出具有同等(主观)优点的可行解决方案。在这种情况下,OP希望就两种相对技术的相对优点发表意见。除了那些已经经历了一个人选择另一个人的实际过程的人的头脑之外,您不会在任何地方找到该信息。因此,这是一个合理的问题。
2012年

Answers:


31

我已经使用Rails和ASP.NET MVC开发了实际的应用程序,但是这个答案带来了一个重要的警告:我是使用第二版Rails进行学习和开发的,所以我完全有可能过时了Rails知识。

话虽这么说,我不认为一个可以完成任何事情,而另一个则无法完成。考虑到Web应用程序的任何要求,您应该能够使用Rails或ASP.NET MVC构建该应用程序(可能同样有效)。

据我所知,ASP.NET MVC中有几件整洁的东西,主要是由于C#/。NET的方面。例如:当我有一个包含提交表单的页面时,我将有一个动作来检查它是否正在处理GET或POST来决定要做什么:

def edit
  @item = Item.find(params[:id])

  if request.post? 
    @item.update_attributes(params[:item])
    redirect_to :action => 'edit', :id => @item.id 
  end
end

这是一个简单的例子,但是这种if request.post?模式在Rails中是非常普遍的。对于非平凡的情况,Action代码可能会变得又大又杂乱,而且经常希望我可以将其整洁地重构为单独的方法。在ASP.NET MVC中,我可以这样做:

public ActionResult Edit() {
  // Render my page that has the Edit form
  ...
}

[HttpPost]
public ActionResult Edit(Foothing foo) {
  // Save my Foothing data
  ...
}

我认为能够完全区分GET和POST请求的处理很整洁。你的旅费可能会改变。

ASP.NET MVC所做的另一件事非常酷(我再次认为)也与处理表单POST有关。在Rails中,我必须查询params所有表单变量的哈希值。假设我有一个表单,其字段为“ status”,“ gonkulated”,“ invert”和“ disposition”:

def edit
  @item = Item.find(params[:id])

  if params[:status] == "new"
    ...
  else
    ...
  end

  if params[:gonkulated] == "true"
    ...
  else
    ...
  end

  if params[:invert] == "true"
    ...
  else
    ...
  end

  # Rest ommited for brevity
end

但是ASP.NET MVC巧妙地允许我将所有表单值作为我的Action方法的参数:

[HttpPost]
public ActionResult Edit(int id, string status, bool gonkulated, bool invert, int disposition) {
    ...
}

这是我真正喜欢ASP.NET MVC或Rails的两件事。对于任何有理智或有能力的开发人员选择一个框架而不是另一个框架,它们是没有足够的理由的。


6
关于动作参数:我本以为public ActionResult Edit(Foothing foothing),即ModelBinder的功能更加整洁。
rmac 2011年

10
Rails示例已经过时了。它们可以工作,但是有更好的方法可以做到这一点。
詹森

2
@Jason:您是否愿意对此进行扩展并可能发布要点
2012年

3
我同意request.post吗?在我看来也很不寻常(也许是因为它是在旧版本中使用的)。我从Rails 3开始,编辑方法始终是“ get”。我想您可以将其配置为发布,但是Rails使用RESTful模式,该模式将使用“更新”方法对模型中发生的任何更改进行发布。因此,如果操作正确,您甚至不必检查'edit'方法是否为帖子。
PhillipKregg 2012年

3
仅仅因为您提出明智的论据就投票给您。我更喜欢Rails,但这完全是主观的,因此您可以辩护。
史蒂夫·希尔

6

与Rails相比,ASP.NET MVC的一个优势是,如果您需要在现有数据库上构建新的应用程序。Rails的ActiveRecord对于如何构造表(表必须具有一个且只有一个整数列作为主键,称为“ id”等)非常有意见,因此,如果您现有的表不符合ActiveRecord首选项,则很难制作ActiveRecord工作。但是使用ActiveRecord和Rails用新的数据库开发新的应用程序很快!

ASP.NET MVC没有默认的ORM。您可以选择适合自己需求的数据访问策略。像nhibernate这样的ORM可以支持旧数据库。您可以使用guid主键等。

Rails ActiveRecord的替代方法是DataMapper,但我没有尝试过。


9
如果遵循某些约定,Ruby的ActiveRecord确实可以消除很多代码,但这不是必需的。如果不遵循约定,则必须更加明确。
凯文·克莱恩

1
ASP.NET MVC具有用于ORM的实体框架,到目前为止,就我的经验而言,该框架非常出色。
库珀

如果说真棒,那么您执行错误生成的查询的速度要比正确编写的SQL慢20倍,是的;)... Dapper Contrib是我发现的又快又快的东西
niico

2

两者兼而有之,IMO的回答是,如果您的应用程序需要做的不仅仅是从数据库读取/写入,则ASP.NET MVC比Rails更灵活。以我的经验,Rails在您向应用程序介绍任何形式的复杂性或逻辑(除了非常琐碎的CRUD逻辑之外)的那一刻,都会迅速崩溃。ASP.NET MVC不会遇到此限制,因为它对您的操作更加“开放”。

在典型的“ Web 2.0” CRUD应用程序中,所有其他条件都是相同的,没有其他可以做的,但是对于需要工作流,不同数据源或与另一个应用程序进行交互的更复杂的应用程序,则那不是典型的CRUD,ASP.NET可以做更多的事情,而且不像Rails那样严格。


9
-1我看不出将ASP.NET MVC视为更灵活的任何原因-如果您查看主要组件,路由,控制器,渲染,它们全都扯开了轨道,并且缺少许多功能。
scottschulthess 2012年

1
ASP.NET MVC如何“更加开放”?我可以跳过整个粗略的脚手架工作,从头开始制作模型和控制器,并创建嵌套的关联-一对多,多对一,多对多-无需任何“分解”。而且,如果我决定使用JavaScript繁重的前端,则可以轻松地将所有模型数据以JSON(或XML或任何其他格式)发送给客户端。另外,如果您可以想到要实现的功能,那么可能已经有了一个绝妙的选择。找到不平凡的Rails应用程序并不难。
PhillipKregg 2012年

2
能够使用原始的c#/ .net框架会被认为更灵活吗?
克里斯·巴里

2
这很晚了,但是我在这篇文章中所指的是ASP.NET MVC,它使您可以使用C#/。NET并利用整个框架。当时的Rails(我想大概是2.0左右?我不记得了)基本上使CRUD非常容易,而其他一切都变得很困难。我写此项目时正在从事的项目是在Rails中完成的(我的错误),并打破了我们在“从数据库读取,在页面中显示”之外进行逻辑处理的那一刻,这是我在C#/ ASP.NET MVC中完成的(在这一点上IIRC)(我选择了Rails代替1.0)就不会遇到很多问题。
韦恩·莫利纳

2

我从未与Ruby on Rails一起工作过,所以我没有完全资格回答这个问题,但是我非常喜欢ASP.NET MVC的一件事是类型安全。这是有道理的。亚当·克罗斯兰(Adam Crossland)和rmac在他们的评论中简要地谈到了它,但是我想指出的是,使用如下所示的控制器方法,每个参数都将被强类型化。这使Edit方法中的代码更加整洁,因为您不必担心将字符串表示形式转换为正确类型的变量。

[HttpPost]
public ActionResult Edit(int id, string status, bool gonkulated, bool invert, int disposition) {
    ...
}

此类型安全性显示的另一位置是“视图”和“部分视图”,在其中可以将部分视图的视图与Plain Old C#对象关联,该对象将用作该视图或部分视图的模型。这使工作变得更加轻松,尤其是在您要构建包含其他视图的视图层次结构的地方。

如果Infinity.ViewModels.Site是包含名为的类的名称空间ContactViewModel,则对于Razor视图,您可以通过在视图顶部放置如下一行来实现:

@model Infinity.ViewModels.Site.ContactViewModel

对于ASPX视图,可以通过以下方式声明视图:

<%@ Page Language="C#" ="~/Views/Shared/Site.master" ="System.Web.Mvc.ViewPage<Infinity.ViewModels.Site.ContactViewModel>" %>

您可以在Controller动作方法中将模型对象的实际实例与视图相关联,然后通过视图的Model属性访问视图中的模型对象的实例。

对我而言,这种坚强的型真的很酷。创建ASP.NET MVC的团队花费了很多心血来使3个Model,View和Controller区域中的每个区域都得到强类型。

我不确定Ruby-on-Rails是否有此功能,但我希望如此。


Ruby语言也是强类型的(也是鸭子类型的)。Rails使用活动记录来自动将其模型与视图关联。您无需在控制器中声明它们。如果要创建嵌套的视图层次结构,则可以在控制器中创建一个实例变量,以表示要传递给视图的模型。是的,他们都可以做同一件事。
PhillipKregg'3

1

它们非常相似,并且大多数都可以“做相同的事情”,只是其中一些事情比一件事情容易而难。

我在原始发行版附近使用了ASP.NET MVC,它肯定是Rails克隆减去activerecord。因此,Rails几乎可以肯定具有更大的功能集和更大的插件/宝石生态系统。


2
的确如此-但Rails已经存在了大约8年,因此它具有领先优势。我从Rails到asp.net,MVC 3实际上非常好。到目前为止,实体框架和NuGet软件包管理器对我印象非常深刻。
PhillipKregg 2012年

1

以我有限的经验,ASP.NET MVC的主要优点是它是一种编译语言。这样,您就可以在编译时检测到一些编程错误,而Ruby在单元测试期间必须依靠检测这些错误。

同样,它被编译的事实使得拥有高级重构工具成为可能,例如,在一处更改属性的名称,并更改对该属性的所有引用。至少在许多Rails开发人员使用的TextMate中无法做到这一点。

另一方面,Ruby on Rails的主要优点是它是一种解释型语言;)Ruby的本质(如何修改内存中的任何对象或对类进行猴子修补)可以带来一些非常优雅的解决方案;请查看《Eloquent Ruby》一书中的一些示例。而且很多Rails框架本身就是基于这种能力的。

随时可以替换任何对象上任何方法的能力也极大地帮助了我编写单元测试。在.NET中,依赖注入和IOC容器实际上是创建可测试代码的要求。在Ruby中这不是必需的。

编辑:

考虑一下之后,Rails的杀手feature可能是数据库迁移。ASP.NET MVC框架本身不提供任何数据库支持。.NET框架确实具有一些数据访问组件/ ORM,例如Entity Framework和Linq to Sql。但是它没有用于设计数据库结构的任何工具。

如果您购买了VS中较昂贵的版本之一,则可以获得Data Dude,它可以设计数据库架构,并提供一些用于将该架构部署到数据库的工具。但是据我所知,对从早期版本的应用程序迁移进行处理的支持非常有限。

有人声称,由于缺乏对数据库迁移的支持,ASP.NET MVC并不是真正的MVC框架,而仅仅是VC框架。

再次编辑:

自从我上次编辑以来,对Visual Studio工具链/ EF的更改已引入了基于代码的迁移。(如果您要沿着那条路走,也可以查看FluentMigrator)


2
Entity Framework 5.0 Code First支持迁移
hofnarwillie 2013年

实际上,从4.1开始就支持代码优先迁移,这是我编辑后不久AFAIK发布的。
皮特

-1

我对Microsoft的MVC 3和Entity Framework的主要问题是它们惊人的糟糕设计原则。

我遇到的第一个问题是将另一个类用作属性并尝试为可能的值创建下拉列表时。

为了说明我的观点,假设您有两个类似的模型类:

public class Color
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Thing
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual Color Color { get; set; }
}

创建Color属性对于实际的ORM而言已足够,但对于EF而言已足够。您必须在Thing类中为Color属性添加一个冗余ID,如下所示:

public class Thing
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int ColorID { get; set; }
    public virtual Color Color { get; set; }
}

如果不为外部对象引用添加冗余ID字段,则无法使用链接类中的所有可能选项轻松创建下拉列表。

这确实是一个糟糕的设计,因为它将一个类的内部工作原理与另一个类紧密地结合在一起。对ColorID一无所知,Color类应该处理自己的相等性检查,而不会暴露其甚至具有ID。

这是最佳实践101的东西,但显然Microsoft完全不了解计算机科学和面向对象编程的基本原理。[/ rant]


8
您在实体框架对象上不需要外键属性。此外,EF是完全独立的产品,不以任何方式与ASP.NET MVC集成。您应该使用视图模型来构建用户界面,并构建任何下拉列表或其他控件。
路西法·萨姆

我同意。您的实体框架中根本不应该有任何ID密钥。ORM应该处理对象身份。但是要点;我真的在抱怨可怕的EF ORM。那个例子是一个直接来自Microsoft的简化版本。这就是他们在ContosoUniversity示例中的做法。这确实说明了我的意思。微软不知道如何做MVC或ORM,他们的例子证明了这一点。
迈克·伯大尼

1
添加ColorID属性使您可以实现惰性加载模式,这有时非常有用。例如,如果引用的对象非常大,并且您实际上并不需要该对象的所有属性值,则仅查找其相关ID部分(ColorID)来获取所有对象就浪费了处理时间。 。它还允许您实现Nullable / Non-Nullable外键,即如果不总是需要Color怎么办?将ColorID更改为可空整数int?
hofnarwillie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.