12

我是asp.net Web窗体开发人员,我知道Asp.net MVC的基础知识。开发人员谈论MVC的优势,但我还没有遇到过使用MVC over Asp.NET的明确或有说服力的描述。为什么Asp.NET MVC在Asp.NET Web窗体

这不是重复的问题,我已经通过几乎所有 类似的问题了,但更多关于 与现实生活中的例子并没有得到明确的说明。我很欣赏和期待的每个 与现实生活中的例子下面提到请 不要将其标记为重复的每一个问题的解释和。

我知道你不能替换Asp.NET MVC还是我们遵循MVC优势Asp.NET Web窗体:

  1. 的关注(SoC)的分离:我们可以实现它在asp.net中,实际上通过在MVC中添加BAL组件,我们必须将业务逻辑与控制器操作方法隔离开来.SoC只适用于MVC中的模型 - 视图 - 控制器分离吗?那么商业逻辑呢。请提供真实生活的例子,它将考虑Web窗体和MVC。
  2. 启用了渲染HTML完全控制:Web窗体还提供控制HTML是不是?它认为Web Forms中的HTML渲染更加抽象,然后html helper方法在MVC中做了什么。任何人都可以考虑使用Web Forms和MVC来解释它,因为在这一点上我越来越困惑。
  3. 启用测试驱动开发(TDD):如果您已经分开你的业务逻辑集成到BAL那么你已经实现了TDD?有什么情况下MVC将是webforms的准确选择?请提供相同的示例
  4. 没有ViewState和PostBack事件:我们可以管理Web窗体中的viewstate,这是伴随着努力的代价,因为在MVC中我们可以使用Viewbag维护状态,Tempdata作为web是无状态的, MVC是否将状态保持为Web窗体的隐藏字段,然后MVC如何根据状态提高性能和页面大小?通过考虑Web窗体和MVC的示例赞赏
  5. 与jQuery轻松集成:“Asp.NET Web窗体为控件生成其自定义标识”这是考虑到易于集成JavaScript框架的唯一考虑因素吗?如果是的话,我们可以在Web窗体中使用ClientIDMode在asp.net控件中。
+1

您能否提供这些语句的来源?其中一些在没有背景的情况下颇具争议。 –

+0

@d_z:http://stackoverflow.com/questions/102558/biggest-advantage-to-using-asp-net-mvc-vs-web-forms请参阅cvs的回答 – Smack

+0

@d_z:你也可以参考http ://msdn.microsoft.com/en-us/library/dd381412%28v=vs.108%29.aspx – Smack

回答

1

好的。

我正在这两个框架开发应用程序,即Webforms和MVC,将根据我的经验来解释事情。

纪律是任何架构所需要遵循的最重要的事情。

如果你遵循MVC正确的,按标准的生活将是超级简单。

让逐点去点。的顾虑

分离(SoC)的: MVC各级提供清洁,组织和粒状溶液例如 有多个helper类挂钩并且在后期绑定中有帮助,你可以使用各种插件来模拟控制器。 易于开发助手类。

启用了渲染HTML 基本上在MVC中,我们以原生格式有HTML完全控制,让你有更多的控制权,当你有很多的控制和数据是如何重要的是加快了页面加载即将出现在网页上。当我们使用Web表单体系结构时,它很重要。

启用测试驱动开发(TDD): 纪律你能做到这两个建筑

没有的ViewState和回发事件: 视图状态提出,当你看到网页上,并在网页表单额外负担有很多控件,网格等的页面源,你会看到巨大的视图状态。 如果没有视图状态,生活就简单了。 ViewData位于客户端,而其他位于服务器端。

与Jquery易于集成: 实际上,MVC3,4对JQuery有更好的支持。有很多已经在模板中引入的预定义JQueries。

除了以上几点一些附加分 捆绑 装修一新的,现代化的默认项目模板 更好地支持移动应用 快速发展 代码的可重用层内 最小耦合 阿贾克斯

的良好支持

看一看几个环节

http://www.codeproject.com/Articles/683730/New-Features-in-ASP-NET-MVC http://www.asp.net/mvc/tutorials/hands-on-labs/whats-new-in-aspnet-mvc-4

Difference between ASP.NET MVC 3 and 4?

+0

感谢您的重播nipun。使用SoC确定“有多个帮助类可以挂钩,并且在后期绑定中有帮助”您能否为此提供真实生活中的示例?为启用完全控制呈现的HTML我仍然不清楚,我们可以在webform中使用native html,也可以使用ViewState和PostBack事件:您不会有控件,但仍然(客户端)状态使用模型,viewbag,viewdata来维护不知道MVC如何在客户端,如果你详细说明,这将是非常棒的。 – Smack

+0

2分: 1.对于Helper类:基本上当你的设计模式是Singleton时,这意味着类只会被初始化一次,因此在Late Bindings中,假设你需要提取信息来进行Authroization或验证,它可以完成最近。 2.是的,你可以随时在webform中使用Native html控件,点是你为什么要这样做?如果你在工具箱中有很多控件可以使用和利用。为什么需要脱离联盟?在MVC中,我们没有这些类型的控件,因此我们使用本机HTML控件。 –

12

1的顾虑

的SoC在MVC分离不是关于从UI分离的业务逻辑。更重要的是,它给控制器主要功能:

  • 域模型填写视图模型;
  • 来处理查看活动;
  • 根据域逻辑显示视图。

视图仅负责MVC中的数据表示。

它使测试作为控制器经营纯视图模型类,而不是其经营活动和形式的WebForms非常简单。

In WebForms 查看处理所有UI活动,它基本上做出有关场景流的决定。

在这里,我想提一提,中View ModelDomain Model方面是不同的。 域名模式是一个描述所有服务的术语,业务逻辑和DAL隐藏于控制器与一些外观。并且查看模型是封装了View所需的数据的类。在简单的情况下,它可能由域模型共享。 Why two classes?

下面是ASP.NET MVC和WebForms类似的代码片断,它们执行相同的操作:1)获取数据2)处理数据提交。在这两种情况下,我都假设注入了IDomainModel

MVC:

public class SomeController : Controller 
{ 
    // injected 
    public IDomainModel Domain { get; set; } 

    public ViewResult Edit() 
    { 
     var record = Domain.GetRecord(1); 
     var dictionary = Domain.GetSomeDictionary(); 
     var model = new SomeViewModel(record, dictionary); 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Edit(SomeViewModel model) 
    { 
     if (ModelState.IsValid) 
      // save 
      return RedirectToAction("Result"); 
     else 
      return View(model); 
    } 
} 

的WebForms:

public partial class SomePage : System.Web.UI.Page 
{ 
    // injected 
    public IDomainModel Domain { get; set; } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     var record = Domain.GetRecord(1); 
     var dictionary = Domain.GetSomeDictionary(); 

     RecordId.Text = record.Id.ToString(); 
     RecordName.Text = record.Name; 
     RecordDescription.Text = record.Description; 

     DicValue.DataSource = dictionary; 
     DicValue.DataValueField = "Id"; 
     DicValue.DataTextField = "Value"; 
     DicValue.SelectedValue = record.DictionaryEntryId.ToString(); 
     DicValue.DataBind(); 
    } 

    protected void btnSave_Click(object sender, EventArgs e) 
    { 
     var record = new RecordModel 
     { 
      Id = Int32.Parse(this.RecordId.Text), 
      Name = this.RecordName.Text, 
      Description = this.RecordDescription.Text, 
      DictionaryEntryId = Int32.Parse(this.DicValue.Text) 
     }; 
     // save 
    } 
} 

测试MVC控制器Edit GET是非常简单的:

[TestMethod] 
public void EditGetTest() 
{ 
    SomeController target = new SomeController(); 

    var record = new RecordModel { Id = 1, Name = "name1", Description = "desc1", DictionaryEntryId = 1 }; 
    var dictionary = new List<SomeDictionaryEntry> 
    { 
     new SomeDictionaryEntry { Id = 1, Value = "test" } 
    }; 

    target.Domain = new SimpleMVCApp.Models.Fakes.StubIDomainModel() 
    { 
     GetRecordInt32 = (id) => { return record; }, 
     GetSomeDictionary =() => { return dictionary; } 
    }; 

    var result = target.Edit(); 

    var actualModel = (SomeViewModel)result.Model; 
    Assert.AreEqual(1, actualModel.Id); 
    Assert.AreEqual("name1", actualModel.Name); 
    Assert.AreEqual("desc1", actualModel.Description); 
    Assert.AreEqual(1, actualModel.DictionaryEntryId); 
} 

要测试的WebForms,我们需要做出很多改变事件和假设:我们需要公开方法,我们需要初始化Form及其合作伙伴ntrols。它会导致严重的硬读测试,这对3)TDD是不可能的。

2.启用了渲染HTML

我觉得这种说法是有点夸张的完全控制。只有HTML可以完全控制呈现的HTML。至于HtmlHelpers,DisplayTemplates和EditorTemplates,尽管该团队对框架的6个版本进行了重大改进,但将additionalViewData转换为html属性仍有时令人讨厌。
例如,要将一些html属性传递给输入,您不能使用@Html.EditorFor,那么必须使用@Html.TextBoxFor
与此同时,在ASP.NET中,您可以指定任何元素的任何属性,它们只会渲染。

MVC:

错误:

@Html.EditorFor(m => m.Name, new { MySuperCustomAttribute = "Hello" }) 

正确:

@Html.TextBoxFor(m => m.Name, new { MySuperCustomAttribute = "Hello" }) 

ASP.NET:

<asp:TextBox runat="server" ID="RecordName" MySuperCustomAttribute="hello"></asp:TextBox> 

3.启用测试驱动开发(TDD)

我觉得这种说法是大约控制器的测试VS 代码隐藏。我在中报道过。

4号的ViewState和回发事件

ViewBag和ViewData的是弱类型的设施,通过控制器和视图之间的数据。它们呈现为元素,与ViewState无关。例如,在我的视图中,我初始化了ViewBag.Title = "EditView";,它允许我在布局页面上使用这个字符串:<title>@ViewBag.Title - My ASP.NET MVC Application</title>。在网页上,它看起来就像这样<title>EditView - My ASP.NET MVC Application</title>

至于TempData的,会话和应用程序,它们存储在服务器端。它根本不呈现在页面上。

5.使用jQuery

易于集成我看不出与jQuery如何融合成为MVC更容易。下面是我们如何整合JQuery的到的WebForms:

<script src="Scripts/jquery-1.8.2.min.js"></script> 
<script> 
$(document).ready(function() { 
    $('#DicValue').change(function() { 
     $('#ChosenValue').text($('#DicValue option:selected').val()); 
    }); 
}); 
</script> 

这里几乎是ASP.NET MVC相同的片段:

@section scripts{ 
<script src="~/Scripts/jquery-1.8.2.min.js"></script> 
<script> 
$(document).ready(function() { 
    $('#DictionaryEntryId').change(function() { 
     $('#ChosenValue').text($('#DictionaryEntryId option:selected').val()); 
    }); 
}); 
</script> 
} 

还有一点提关于jQuery的位置:为ASP.NET MVC相当于Opinionated framework,它对于广泛的JS用法有些限制。它最初是为基于脚手架模板的开发而设计的,最适合它。 JQuery适用于Ajax请求和ASP.NET MVC中的一些次要逻辑,但当您开始广泛使用它时,最终会为每个视图提供两个控制器:一个C#和一个JS。你好,单元测试!另外,JQuery(UI)拥有丰富的UI控件。

ASP.NET设计时考虑回传,他们决定你的基本应用模式。但是,也有不同的用于ASP.NET的UI工具包可以使应用程序更具动态性,并且仍然有一些适用于JQuery的地方。

哇,这是一个很长的答案。希望它会有所帮助。

+0

感谢您的时间dz ok,我同意你的观点1,对于第3点,我认为这取决于你想要如何测试你的业务逻辑,在通知中,你可以很容易地测试BAL,所以没有太大的差别,对于第4点“他们被渲染为元素“我真的不知道并且想要探索它 – Smack

+0

@Smack,你能给一个BAL的链接吗?我还没有听说过。至于ViewBag和ViewData,请查看[链接](http://www.codeproject.com/Articles/476967/WhatplusisplusViewData-cplusViewBagplusandplusTem) –

+0

它只是一个类库项目,您放置您的业务逻辑BAL(业务访问层)它的术语用于3层架构a我们编写DAL(数据访问层)用于数据库操作 – Smack

0

下面是来自微软的这个问题,官方的回答:http://www.asp.net/get-started/websites

我会添加到顶部的答案(这通常是正确的),比MVC(和网页)都是开源的,所以你有一个轻松访问源代码,bug数据库,甚至可以修复或修复PR错误(我们已经大量使用)。

在一天结束的时候它是一个个人的选择,同时也依赖于经验,你和你的团队拥有,如果你有遗留代码要重复使用。

0

MVC框架不会取代Web窗体模型;您可以为Web应用程序使用任一框架。 (如果您有现有的基于表单的Web应用程序,这些不断,正是因为他们总是有工作)。 在你决定使用一个特定的网站的MVC框架或Web窗体模型,权衡每个方法的优点。一个基于MVC的Web应用程序

的ASP的

优势。NET MVC框架提供以下优点:

通过将应用程序划分为模型,视图和控制器,可以更轻松地管理复杂性。

它不使用视图状态或基于服务器的表单。这使得MVC框架非常适合想要完全控制应用程序行为的开发人员。

它使用前端控制器模式,通过单个控制器处理Web应用程序请求。这使您可以设计支持丰富的路由基础结构的应用程序。

它为测试驱动开发(TDD)提供了更好的支持。

它适用于大型开发团队支持的Web应用程序以及需要高度控制应用程序行为的Web设计人员。

它支持的事件模型,在HTTP保持状​​态,有利于线的:基于窗体的Web的Web应用程序

基于表单的Web框架提供了以下优点

优势 - 商业Web应用程序开发。基于Web窗体的应用程序提供数百个服务器控件支持的数十个事件。

它使用页面控制器模式,为单个页面添加功能。

它在基于服务器的表单上使用视图状态,这可以使管理状态信息更容易。

对于希望利用大量可用于快速应用程序开发的组件的小型Web开发人员和设计人员来说,它非常适用。通常,应用程序开发并不复杂,因为组件(页面类,控件等)紧密集成,并且通常比MVC模型需要的代码少。

来源http://msdn.microsoft.com/en-us/library/dd381412(v=vs.108).aspx

相关问题