This is not duplicate question and i have gone through almost all
similar question but did not get clear description more in relation
with real life example. I do appreciate and expect the explanation of
each and every question mentioned below with real life example please
don’t mark it as duplicate.
我知道你不能用Asp.NET替换Asp.NET Web窗体MVC仍然在MVC中有以下优势:
>分离问题(SoC):我们可以在asp.net中实现它,实际上在MVC中添加BAL组件,我们必须将业务逻辑与控制器操作方法隔离开来.它仅适用于MVC中的模型 – 视图 – 控制器分离?那么业务逻辑呢?请提供现实生活中的Web表单和MVC的例子.
>启用对渲染HTML的完全控制:Web窗体还提供对Html的控制不是吗?它认为Web窗体中的html渲染更抽象,那么html帮助方法在MVC中做了什么.任何人都可以用Web Forms和MVC来解释它,因为我在这一点上变得更加困惑.
>启用测试驱动开发(TDD):如果您将业务逻辑分为BAL,那么您已经实现了TDD?是否有任何场景,MVC将是对Webforms的准确选择?请提供相同的例子
>没有ViewState和PostBack事件:我们可以管理Web窗体中的viewstate,它带有成本的努力,因为在MVC中,我们可以使用Viewbag来维护状态,Tempdata因为web是无状态的,所以有一些机制,MVC将其状态保持为隐藏字段Web窗体然后MVC如何改善性能和页面大小在状态?通过考虑Web Forms和MVC的例子赞赏
>与jQuery轻松集成:“Asp.NET Web窗体为控件生成自定义ID”这是JavaScript框架易于集成的唯一考虑因素.如果是,那么我们可以在Web窗体的asp.net控件中使用ClientIDMode
解决方法
MVC中的SoC不是关于UI的分离业务逻辑.更重要的是,它给控制器的主要功能:
>从域模型中填充View Model;
>来处理View活动;
>根据域逻辑显示视图.
视图仅负责MVC中的数据表示.
它使测试非常简单,因为Controller运行纯粹的View Model类,与运行事件和Form的WebForms相反.
在WebForms视图中处理所有的UI活动,它基本上做出关于场景流的决策.
这里我想提一下View Model和Domain Model的条款是不同的.域模型是描述所有服务,业务逻辑和DAL隐藏的控制器与一些立面的术语.而View Model是封装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控制器编辑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及其控件.这导致了对于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)
我认为这个说法是关于Controller与Code-Behind的测试.我在1中涵盖了这一点.
4.没有ViewState和PostBack事件
ViewBag和ViewData是在Controller和Views之间传递数据的弱类型的工具.它们被渲染为元素,与ViewState无关.例如,在我的视图中,我初始化ViewBag.Title =“EditView”;这允许我在布局页面上使用此字符串:< title> @ ViewBag.Title – 我的ASP.NET MVC应用程序< / title> ;.在页面上,它看起来像这样< title> EditView – 我的ASP.NET MVC应用程序< / title>
至于TempData,Session和Application,它们存储在服务器端.完全没有渲染页面.
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的设计思想是Postback,它们决定了基本的应用程序模型.然而,ASP.NET也有不同的UI Toolkit来使应用程序更加动态,而且仍然有一些JQuery的地方.
哇,这是一个很长的答案.希望会有所帮助