asp.net-mvc – 为什么Asp.NET MVC通过Asp.NET Web窗体
我是asp.net Web窗体开发人员,我知道
Asp.net MVC的基础知识.开发人员谈论MVC的优势,但是我并没有看到在Asp.NET上使用MVC的明确或引人注目的描述.
我知道你不能用Asp.NET替换Asp.NET Web窗体MVC仍然在MVC中有以下优势: >分离问题(SoC):我们可以在asp.net中实现它,实际上在MVC中添加BAL组件,我们必须将业务逻辑与控制器操作方法隔离开来.它仅适用于MVC中的模型 – 视图 – 控制器分离?那么业务逻辑呢?请提供现实生活中的Web表单和MVC的例子. 解决方法
分离问题
MVC中的SoC不是关于UI的分离业务逻辑.更重要的是,它给控制器的主要功能: >从域模型中填充View Model; 视图仅负责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属性仍然令人烦恼. 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的地方. 哇,这是一个很长的答案.希望会有所帮助 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 通过删除空格打破我的calc语句的MVC捆绑?
- [你必须知道的.NET] 第一回:恩怨情仇:is和as
- asp.net – Windows Azure – NetworkInformationException
- asp.net MVC 3/4相当于一个response.filter
- asp.net-web-api – 找不到Web API路由404
- ASP.NET MVC错误处理 – 删除aspxerrorpath
- asp.net-mvc – 上传文件:MemoryStream与文件系统
- asp.net – 允许文本框中的HTML
- asp.net-mvc – ASP.NET MVC:具有POST Action参数的Redire
- Asp.net mvc – 获取上传文件的完整文件名
- asp.net core 使用 signalR(一)
- asp.net-mvc-3 – ASP.NET MVC3 – DateTime格式
- asp.net – RequireNonLetterOrDigit未正确验证
- asp.net-mvc-3 – 禁用ASP.NET-MVC3中的unicode字
- 在ASP.NET中,获取基本UR1请求的最快方法是什么?
- asp.net-mvc – asp.net mvc强类型助手 – 你的渲
- asp.net-mvc-3 – 陷入ASPNETCOMPILER:错误ASPR
- asp.net-mvc – 如何动态预选ASP.NET MVC中html.
- asp.net-mvc-3 – 与SQL Server建立连接时发生与
- asp.net – 是否可以并行运行iis6和iis7?