ASP.NET WebForms + ASP.NET Ajax与ASP.NET MVC和Ajax框架自由的比较

21

如果给你选择的机会,你会选择哪条路?

ASP.NET Webforms + ASP.NET AJAX

还是

ASP.NET MVC + 你选择的 JavaScript 框架

相对于 MVC,ASP.NET Webforms/ASP.NET AJAX 有什么限制吗?


1
ASP.NET Webforms + JavaScript框架或者ASP.NET Webforms + ASP.NET AJAX+ JavaScript框架怎么样? - Sharique
14个回答

29

最近我都做过,但如果要选择的话,我会十次中有九次选择MVC。

  • 我非常不喜欢asp.net ajax控件的实现方式,我遇到了很多时间、事件和调试回发问题。我从http://encosia.com/2007/07/11/why-aspnet-ajax-updatepanels-are-dangerous/学到了很多。
  • 我们在asp.net项目中使用了MVP模式http://www.codeplex.com/aspnetmvp,模式运作良好。但是,由于我们直接与服务器端控件交互(例如大量的gridview操作),所以在视图中产生了大量的代码。这些代码几乎无法通过单元测试框架进行测试。我们应该更加勤奋地避免将代码放入视图中,但在某些情况下,使用这种方法更加简单和整洁。

我唯一会选择使用asp.net表单开发的时候就是使用gridview控件。我们正在使用MVC作为javascript框架,并且还没有找到像gridview一样好的控件。我们已经花费了大量的时间来学习、调整和调试,而与使用asp.net服务器端控件相比,效果并不理想。在非asp.net表单开发中,失去了所有微软提供的漂亮小部件是一种自由,但刚开始时也很可怕。

最终,我很高兴我们选择进行MVC开发。我和我的团队学会了一种新的框架(我们之前只是asp.net开发人员),并且亲手体验了html和javascript。这些都是我们可以应用到其他项目或其他语言中的技能。


2
您是否考虑使用 jQuery 和 DataTables.Net 实现客户端网格?很多时候,服务器端网格控件可能会过于冗余。 - David Robbins

11

不要让别人欺骗你,认为这是一个明确的选择。你可以同时兼顾两者。我的方法是创建一个MVC项目,但是不添加视图,而是添加标准的ASP.NET页面,并将代码后台更改为继承自MVC.ViewPage,就像这样:

public partial class SamplePage : System.Web.Mvc.ViewPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
}

如果你在前端代码中只使用带有 runat="server" 属性的单个 form 标签,那么你就可以完全通过代码后台访问标准的 ASP.NET 服务器控件。这意味着你可以完全控制页面的服务端呈现(例如使用数据绑定和重复器),而不必像早期的 ASP 风格代码一样进行编码。

    protected void Page_Load(object sender, EventArgs e)
    {
        IObjectDefinition instance = (IObjectDefinition)ViewData["definition"];
        _objectName.Text = instance.DisplayName;//textbox or label

        DataTable itemVals = new DataTable();
        itemVals .Columns.Add("itemName");
        itemVals .Columns.Add("itemValue");            


        IDictionary<string, string> items = (IDictionary<string, string>)ViewData["items"];
        foreach (KeyValuePair<string, string> datum in items)
        {
            conditions.Rows.Add(new object[] { datum.Key, datum.Value});
        }

        _itemList.DataSource = itemVals;//repeater
        _itemList.DataBind();
    }
任何控件的帖子都不是提交到页面,而是提交到控制器。 如果您记得在服务器控件上使用name属性,则它们将以标准MVC的方式出现在FormControl集合中,以访问页面变量。
所以你得到什么?:
完全的服务器端控制,前端代码仅为HTML和asp.net服务器控件标记。 完全的关注点分离 - 页面仅显示呈现,所有编排和组织都在控制器中完成(而不是类似于ASP.NET在页面中完成)。 完整的MVC可测试性 没有HTML代码编织 您可以关闭视图状态并减少页面膨胀
你失去了什么?
如果您只想使用服务器控件,则再次限制每个页面一个表单。 您可能需要手动指定按钮和表单的回发目标。 您再次需要两个文件来呈现页面。
噢,对于AJAX - 绝对是jQuery。 向返回JsonResult的控制器方法发出请求确实简化了事情。

1
一种新颖的方法。我很惊讶没有任何ASP.NET专家参与讨论。 - Mitch A
@Mike,如果一个asp:button按钮将要提交到控制器操作,那么它的点击事件如何执行正确的代码后台事件呢? - Sunil

9
我喜欢WebForms,但是ASP.NET AJAX很烂。 我更喜欢使用WebForms + 自定义HTTP处理程序来处理任何AJAX调用的服务器端。 嘿,被踩了... ASP.NET AJAX很烂,因为回调需要重新实例化整个页面类,你不是在调用单个方法,而是在每次都要在服务器上重建整个页面。 此外,UpdatePanels返回整个页面,只有更新面板中的部分弹出,这是完全浪费带宽。 我理解为什么要这样做,因为WebForms控件不能很容易地通过其他方式实现,但它仍然非常糟糕。

现在我很好奇。WebForms + ASHX的示例实现会是怎样的? - Bullines
你不必局限于使用ASHX来实现处理程序,你可以将处理程序分组在类文件中,并将处理程序添加到你的webconfig中。这也非常高效,但这取决于你想要实现什么。例如,可以通过最小化开销来调用数据库中的记录锁定。 - Quintin Robinson
2
你能详细说明一下“堆积的垃圾”是什么意思吗? - Jon Limjap
我同意发送HTML而不是JSON会增加数据传输量。但这与在标准网站上页面之间的移动没有什么区别。此外,ASP AJAX提供了Web服务交互功能,可以将SOAP调用的结果转换为JSON格式。这非常好。 - Owen
如果您使用WebMethods/PageMethods,您将无法获取整个页面。 - Lurker Indeed
您可以在不使用MS Ajax的情况下使用WebmMethods。使用jQuery发送POST请求并将结果作为JSON消耗掉。这个方法非常好用,而且您甚至可以关闭ViewState。 - David Robbins

8

我看到大多数的回复都是在MVC 1.0之前发布的。由于我们现在已经进入了2.0预览版,我认为重新讨论一下可能会很好。

去年三月之前,我是ASP.NET开发人员约五年。但自从我转向MVC后,我没有丝毫后悔。我现在意识到,在ASP.NET WebForms上越强大,学习其他技术(如JavaScript和非Microsoft实现的AJAX)就越困难。微软将他们的ASP.NET开发方法从WinForms开发方法中借鉴过来,这对于从WebForms开发转移而来的人来说有助于降低学习曲线,但如果您理解两种方法之间的差异,那么这并不是一种良好的Web应用程序开发方式。

我正在处理的最新项目要求我学习ASP.NET MVC、JavaScript、jQuery、CSS 2和AJAX(非Microsoft)。只用了九个月,我感到比五年ASP.NET开发后更好地准备好了处理Web开发项目。ASP.NET的实现使得长期维护变得更加困难。MVC使得事情更加容易,因为你不太依赖快捷方式。需要一段时间来学习框架,但你越了解框架,你就越不依赖框架,越能开始学习和理解已经建立的标准,比如JavaScript和AJAX。

对我来说,这是一个明显的选择。我永远不会回到ASP.NET。如果我不能使用ASP.NET MVC,那我就会学习Ruby或PHP。我希望推动我的Web开发工具的进步和发展是由开发者社区的需求而驱动的,而不是为了利润。


2
我必须说,我基本上走了与您几乎完全相同的道路,我永远不会再回到ASP.NET WebForms。在过去的几个月中,我学到了(仍在学习)JS,jQuery(还好),更多关于HTML和HTTP标准的知识(我以为我很懂,但实际上我几乎一无所知),这样做起来就容易得多,例如部分渲染、AJAX的POST/GET、纯HTML控件等等。WebForms隐藏了我们的所有内容——这是一种好的技术,我喜欢它,但从现在开始,我只会维护它,而在MVC中开发新事物。 - mare

2
如果您需要更新面板,我建议您使用开源且轻量级的MagicAjax或ComfortASP。如果您需要框架来帮助开发自定义的ajax,我建议使用jQuery。

2

ASP.NET MVC仍处于“预览”形式,因此在其成熟之前,我不会考虑它。您可以很容易地自己创建MVP模式,无需太多的管道。

在Ajax方面,我建议尝试查找可以实现您要求的库(商业或其他)。基础知识(网格,树,自动完成文本框等)已经被深入研究过了,不要重复造轮子。


ASP.NET MVC虽然可能处于RC阶段,但有趣的是Stackoverflow完全建立在ASP.NET MVC之上。 - Notorious2tall
当然,这并不意味着我会相信它用于支付账单的系统。StackOverflow.com在刚开始时只是一个玩具。 - Giorgio Galante

2

在设计网站时,我更喜欢遵循DRY原则。我认为ASP.NET MVC比Web Forms更符合DRY原则。

最近我从Web Forms转向了MVC,希望再也不用回去了!


1
MVC的概念很好,但要准备放弃使用多年的所有服务器控件的功能。我只看了大约一周的MVC实现,但页面生命周期和视图状态已经消失了,因此这些控件不再能正常工作。
我还惊讶地发现了许多示例,在标记中包含了大量的逻辑代码。没错,在aspx文件中有“if”和“foreach”语句——在我看来是一个可怕的倒退。我非常高兴离开了经典的ASP,但在当前的ASP.NET MVC模式实现中,你又回到了在标记中编写代码、需要随处使用帮助器以及几乎没有可用的服务器控件的情况。
如果您现在要开始一个新项目,我建议继续使用ASP.NET WebForms,并根据需要使用内置的ASP.NET AJAX、工具包和jQuery。ASP.NET AJAX的实现可能不是最好的或最有效的实现,但除非您在第1天就获得了100万个独特用户或您的服务器是Commodore VIC 20,否则性能影响并不会那么明显。

当然,这取决于您的项目规模。如果您正在启动一个期望有数百万页面浏览量的5年企业级应用程序,UpdatePanel可能不够用,但如果您正在构建一个普通网站、快速搭建原型或只是需要快速上手,asp.net ajax完全可以胜任,并且学习曲线极低。

并且要明确的是,每次进行ajax调用时,绝对不会返回整个页面,而/仅仅/会发送需要更新的面板内容。任何http监视器都可以证明这一点。是的,页面/生命周期/会被执行,但是您可以构建相当高效的asp.net ajax应用程序。


回复:关于UpdatePanels,那不是完全准确的。即使只有一个并发用户的网站,在替换UpdatePanels后也会看到巨大的性能提升。你必须非常不关心你的用户在你的网站上的体验才会在生产中使用它们。 - Dave Ward
有趣的ASP.NET MVC观点...我们正在启动一个新项目,几乎选择了ASP.NET,但是我们中没有人知道如何使用它(我们的团队具有HTML、WinForms和一些PHP背景,但没有人知道ASP.NET)。出于某种原因,ASP.NET MVC似乎更自然,因为它与最终产品密切相关,而不是试图使所有东西看起来像WinForms。 - Beep beep
这是一个很好的观点 - 我应该澄清一下 - 如果你几乎没有asp.net背景,MVC可能是最好的选择。这种模式是可靠的,逻辑上也非常合理。如果你多年来一直没有使用页面生命周期,那么不需要它是很棒的。我只是感到沮丧,因为我的工具包不再起作用,而我没有时间制作新的工具包。 - Mike
第一句:是的,有混合逻辑和用户界面的示例,但那些都是不好的示例,抱歉,拿它作为论点很滑稽...第二句:如果我们谈论Web的本质,我们可以说它是无状态的...所以Viewstate是一种持久化页面状态的解决方法.. :)最后一句:MVC是非常好和自然的框架,你应该再次尝试它,肯定会喜欢的 :)干杯 - Marko
你关于服务器控件的论点以及它们的缺乏是正确的,我也认为这会成为我的问题,但实际上并没有,因为到目前为止,我已经能够用jQuery/jQueryUI的功能几乎替换了所有东西,在许多情况下,甚至可以做得更好。 - mare
还有一件事需要注意的是,我永远不会忘记那些时刻,我所使用的DataGrid、Repeaters和其他WebForms控件突然停止工作——大多数情况是由于HTML中某些东西被损坏了,或者VS本身出现了故障,又或者因为某些奇怪的原因,所有已经连接上的事件都消失了,忽然间,我只剩下未能正常工作的编辑和删除链接(即因事件注册消失而未能回传至服务器)。 - mare

1

我的编程经验是在Apache服务器上使用PHP和Ruby编写Web应用程序。当我得到一份维护使用ASP.NET(WebForms)编写的Web应用程序的工作时,我开始学习微软构建Web应用程序的方式。我必须说我完全感到震惊!我在想这些ViewState垃圾来回发送是什么鬼?这真的有必要吗?

然后,我决定尝试使用Ajax和jQuery做一些简单的事情,这让我了解到更新面板和生成客户端ID,而不是我在视图中设置的内容。这浪费了我很多时间!为什么我不能在一个页面上有多个表单?为什么我不能只使用常规的Ajax调用?为什么我的视图有服务器逻辑?这些都是许多Web程序员在使用ASP.NET WebForms时遇到的问题。然后,我发现了.NET MVC。我的生活变得轻松了很多。

我习惯于使用像Rails和CakePHP这样的MVC框架来创建Web应用程序,以便按照它们被设计的方式进行编程。使用实际为Web而设计的技术。

我的建议是,对于那些习惯于编写winforms类型应用程序的人来说,最好使用WebForms,因为它试图抽象出你正在网页上编程的事实。如果你想要真正自由地开发适合网页程序员的应用程序,可以使用.NET MVC或类似的东西,这样就不会妨碍你的工作。
这是我的两分钱...

虽然经验较少,但我曾使用Perl编写基于Web的逻辑。之后我转向了PHP,然后又进入了ASP。我必须说,微软觉得有必要“微观管理”一切,这真是让人头疼。不过,我非常喜欢C#作为一种语言,编写业务逻辑是一种享受。但是,让它与实际的网页交互却是一场噩梦。所有这些都是因为微软认为这样可以使整个系统更安全(并且可以以此向企业经理销售)。我没有接触过MVC,但根据我听到的,我需要它来改变我的生活! - Alex

1

为了补充@ben的回答,我使用ASP.Net WebForms进行简单数据绑定,并使用JQuery处理所有Ajax事务。老实说,由于其简单性,我仍然无法放弃数据绑定。Viewstate几乎没有用处,所以我基本上将其关闭。你可以使用MVC,但要注意,它会花费你大部分时间来开发在Forms中认为理所当然的功能。祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接