Answers:
ASP.net MVC的主要优点是:
启用对呈现的HTML的完全控制。
提供关注点的清晰分离(SoC)。
启用测试驱动开发(TDD)。
与JavaScript框架轻松集成。
遵循网络无状态性质的设计。
启用SEO的RESTful网址。
没有ViewState和PostBack事件
ASP.net Web窗体的主要优点是:
它提供RAD开发
适用于来自winform开发的开发人员的简易开发模型。
ASP.NET Web窗体和MVC是Microsoft开发的两个Web框架-它们都是不错的选择。这两个Web框架都不能被另一个替代,也没有计划将它们“合并”为一个框架。Microsoft会同时进行持续的支持和开发,而且两者都不会“消失”。
这些Web框架中的每一个都有优点/缺点-开发Web应用程序时需要考虑其中的一些优点/缺点。可以使用任何一种技术来开发Web应用程序-它可能使针对特定应用程序的开发更容易选择一项技术,而选择另一项则相反。
ASP.NET Web表单:
ASP.NET MVC:
身份验证,授权,配置,编译和部署都是这两个Web框架之间共享的所有功能。
年龄足够大,可以记住经典ASP的人都会记住,打开一个将代码与html和javascript混合在一起的页面的噩梦-即使是最小的页面,也很难弄清楚它在做什么。我可能是错的,我希望自己是错的,但是MVC看起来就像回到了那些糟糕的过去。
当ASP.Net出现时,它就被誉为救世主,将代码与内容分离开来,并允许我们让Web设计人员创建html,并由编码人员处理背后的代码。如果我们不想使用ViewState,则将其关闭。如果由于某种原因我们不想使用代码,可以像经典ASP一样将代码放在html内。如果我们不想使用PostBack,我们将重定向到另一个页面进行处理。如果我们不想使用ASP.Net控件,则使用标准的html控件。如果我们不想在控件上使用ASP.Net runat =“ server”,我们甚至可以询问Response对象。
现在,一个非常有才华的人(可能是从未编写过经典ASP的人)已经决定是时候回到将代码与内容混合在一起并称其为“关注点分离”的时代了。当然,您可以创建更简洁的html,但是经典ASP则可以。说“如果您的视图中有太多的代码,则说明您的编程不正确”,就像说“如果您使用经典的ASP编写结构良好且带有注释的代码,则它比ASP.NET干净得多,而且更好”
如果我想回到混合代码和内容的角度,我会考虑使用PHP进行开发,而PHP对于这种开发具有更为成熟的环境。如果ASP.NET有太多问题,那么为什么不解决这些问题呢?
最后但并非最不重要的一点是,新的Razor引擎意味着更难以区分html和代码。至少我们可以在ASP中查找打开和关闭标签,即<%和%>,但是现在唯一的指示将是@符号。
也许是时候改用PHP了,再等10年,以便有人再次将代码与内容分离。
如果您正在与其他开发人员一起工作,例如PHP或JSP(并且我猜是在轨道上),那么您将在页面上进行转换或协作的时间要容易得多,因为您不会拥有所有这些“讨厌的” ASP.NET事件和控件无处不在。
MVC的问题在于,即使对于“专家”来说,它也会占用大量宝贵的时间,并且需要大量的精力。不管背后的技术是什么,企业都受“有效的快速解决方案”这一基本要素的驱动。WebForms是一种RAD技术,可以节省时间和金钱。任何需要更多时间的事情都是企业所不能接受的。
对我来说,最大的单一优势是您的模型,视图和控制器层之间的明确分隔。它从一开始就有助于促进良好的设计。
与ASP.Net相比,我没有看到MVC的任何优势。10年前,Microsoft提出了UIP(用户界面过程)作为MVC的答案。失败了。那时,我们使用UIP进行了一个大型项目(4个开发人员,2个设计师,1个测试人员),那真是一场噩梦。
不要为了炒作而跳入潮流。上面列出的所有优点都已在Asp.Net中提供(具有更大的调整[ Asp.Net 4中的新功能 [ Asp.Net 4中的新功能 ])。
如果您的开发团队或拥有Asp.Net的单个开发人员家庭只是坚持这样做,并迅速制作出精美的产品来满足您的客户(他们为您的工作时间付费)。MVC将消耗您宝贵的时间,并产生与Asp.Net相同的结果:-)
弗朗西斯·沙纳汉(Francis Shanahan)
为什么将部分回发称为“废话”?这是Ajax的核心功能,在Atlas框架和Telerik等出色的第三方控件中得到了很好的利用。
我同意您关于viewstate的观点。但是,如果开发人员小心地禁用了viewstate,则可以大大减小呈现的HTML的大小,从而使页面变得轻巧。
只有HTML Server控件在ASP.NET Web窗体模型中被重命名,而不是纯HTML控件。不管是什么,您为什么如此担心是否重命名?我知道您想在客户端处理很多javascript事件,但是如果您聪明地设计网页,则可以肯定获得所需的所有ID。
甚至ASP.NET Web表单也符合XHTML标准,我认为没有任何膨胀。这不是为什么我们需要MVC模式的理由
同样,为什么还要为AXD Javascript烦恼?为什么会伤到你?这又不是有效的理由
到目前为止,我还是使用经典的ASP.NET Web表单开发应用程序的爱好者。例如:如果要绑定下拉列表或网格视图,则最多需要30分钟且最多不超过20行代码(当然是最少的)。但是在使用MVC的情况下,请与开发人员谈谈它的痛苦。
MVC的最大缺点是我们要回到ASP的时代。还记得将Server代码和HTML混合在一起的意大利面条代码吗???噢,天哪,请尝试阅读混合了javascript,HTML,JQuery,CSS,Server标签和其他内容的MVC aspx页面。任何人都可以回答这个问题?
Web表单还得益于成熟度的提高和第三方控制提供商(例如Telerik)的支持。
在Web表单中,您还可以手动呈现几乎整个html,除了很少的诸如viewstate,eventvalidation之类的标签,可以使用PageAdapters删除它们。没有人会强迫您使用GridView或其他具有不良HTML呈现输出的服务器端控件。
我会说MVC的最大优势是速度!
接下来是强制分离关注点。但这并不禁止您将整个BL和DAL逻辑放入Controller / Action!这只是视图分离,也可以在Web表单中完成(例如MVP模式)。人们为mvc提到的许多事情都可以在Web表单中完成,但需要付出额外的努力。
主要区别在于请求来自控制器,而不是视图,并且这两层是分开的,而不是通过局部类(如Webforms)连接(aspx +代码后面)
MVC控制器:
[HttpGet]
public ActionResult DetailList(ImportDetailSearchModel model)
{
Data.ImportDataAccess ida = new Data.ImportDataAccess();
List<Data.ImportDetailData> data = ida.GetImportDetails(model.FileId, model.FailuresOnly);
return PartialView("ImportSummaryDetailPartial", data);
}
MVC视图:
<table class="sortable">
<thead>
<tr><th>Unique Id</th><th class="left">Error Type</th><th class="left">Field</th><th class="left">Message</th><th class="left">State</th></tr>
</thead>
<tbody>
@foreach (Data.ImportDetailData detail in Model)
{
<tr><th>@detail.UniqueID</th><th class="left">@detail.ErrorType</th><th class="left">@detail.FieldName</th><th class="left">@detail.Message</th><th class="left">@detail.ItemState</th></tr>
}
</tbody></table>
那有多难?没有ViewState,没有BS Page的生命周期...仅是高效代码。
我发现的主要好处是,它迫使项目进入了更具可测试性的结构。使用Web表单(MVP模式)也可以很容易地做到这一点,但是要求开发人员对此有一定的了解,但许多人没有。
Webforms和MVC都是可行的工具,两者在不同领域都表现出色。
在我们主要开发B2B / LOB应用程序时,我个人使用Web表单。但是我们总是使用MVP模式来做到这一点,因为我们可以在单元测试中实现95%以上的代码覆盖率。这也使我们能够自动测试webcontrols的属性。属性值通过视图公开,例如
bool IMyView.IsAdminSectionVisible{
get{return pnlAdmin.Visible;}
get{pnlAdmin.Visible=value;}
}
)我认为在MVC中不容易达到这种测试水平,而不会污染我的模型。
我个人的看法是,使用ASP.Net MVC的最大缺点是... CODE BLOCKS
与
html hell 混合在一起,对维护它的开发人员来说...HTML