asp.net-mvc – 为什么Asp.NET MVC通过Asp.NET Web窗体

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – 为什么Asp.NET MVC通过Asp.NET Web窗体前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是asp.net Web窗体开发人员,我知道 Asp.net MVC的基础知识.开发人员谈论MVC的优势,但是我并没有看到在Asp.NET上使用MVC的明确或引人注目的描述.

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 ModelDomain Model的条款是不同的.域模型是描述所有服务,业务逻辑和DAL隐藏的控制器与一些立面的术语.而View Model是封装View所需数据的类.域模型可以在简单的情况下共享. Why two classes?

以下是ASP.NET MVC和WebForms的类似代码片段,做同样的事情:1)获取数据2)处理数据提交.在这两种情况下,我都假设注册了IDomainModel.

MVC:

  1. public class SomeController : Controller
  2. {
  3. // injected
  4. public IDomainModel Domain { get; set; }
  5.  
  6. public ViewResult Edit()
  7. {
  8. var record = Domain.GetRecord(1);
  9. var dictionary = Domain.GetSomeDictionary();
  10. var model = new Someviewmodel(record,dictionary);
  11.  
  12. return View(model);
  13. }
  14.  
  15. [HttpPost]
  16. public ActionResult Edit(Someviewmodel model)
  17. {
  18. if (ModelState.IsValid)
  19. // save
  20. return RedirectToAction("Result");
  21. else
  22. return View(model);
  23. }
  24. }

WebForms的:

  1. public partial class SomePage : System.Web.UI.Page
  2. {
  3. // injected
  4. public IDomainModel Domain { get; set; }
  5.  
  6. protected void Page_Load(object sender,EventArgs e)
  7. {
  8. var record = Domain.GetRecord(1);
  9. var dictionary = Domain.GetSomeDictionary();
  10.  
  11. RecordId.Text = record.Id.ToString();
  12. RecordName.Text = record.Name;
  13. RecordDescription.Text = record.Description;
  14.  
  15. DicValue.DataSource = dictionary;
  16. DicValue.DataValueField = "Id";
  17. DicValue.DataTextField = "Value";
  18. DicValue.SelectedValue = record.DictionaryEntryId.ToString();
  19. DicValue.DataBind();
  20. }
  21.  
  22. protected void btnSave_Click(object sender,EventArgs e)
  23. {
  24. var record = new RecordModel
  25. {
  26. Id = Int32.Parse(this.RecordId.Text),Name = this.RecordName.Text,Description = this.RecordDescription.Text,DictionaryEntryId = Int32.Parse(this.DicValue.Text)
  27. };
  28. // save
  29. }
  30. }

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

  1. [TestMethod]
  2. public void EditGetTest()
  3. {
  4. SomeController target = new SomeController();
  5.  
  6. var record = new RecordModel { Id = 1,Name = "name1",Description = "desc1",DictionaryEntryId = 1 };
  7. var dictionary = new List<SomeDictionaryEntry>
  8. {
  9. new SomeDictionaryEntry { Id = 1,Value = "test" }
  10. };
  11.  
  12. target.Domain = new SimpleMVCApp.Models.Fakes.StubIDomainModel()
  13. {
  14. GetRecordInt32 = (id) => { return record; },GetSomeDictionary = () => { return dictionary; }
  15. };
  16.  
  17. var result = target.Edit();
  18.  
  19. var actualModel = (Someviewmodel)result.Model;
  20. Assert.AreEqual(1,actualModel.Id);
  21. Assert.AreEqual("name1",actualModel.Name);
  22. Assert.AreEqual("desc1",actualModel.Description);
  23. Assert.AreEqual(1,actualModel.DictionaryEntryId);
  24. }

为了测试WebForms事件,我们需要做出很多变化和假设:我们需要使方法公开,我们需要初始化Form及其控件.这导致了对于3)TDD是不可能的重的硬读测试.

2.启用对已呈现的HTML的完全控制

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

MVC:

错误

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

正确:

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

ASP.NET:

  1. <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&gt ;.在页面上,它看起来像这样< title> EditView – 我的ASP.NET MVC应用程序< / title>

至于TempData,Session和Application,它们存储在服务器端.完全没有渲染页面.

5.轻松与JQuery集成

我看不到与JQuery的集成变得容易MVC.以下是我们如何将JQuery集成到WebForms中:

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

而ASP.NET MVC这几乎是一样的片段:

  1. @section scripts{
  2. <script src="~/Scripts/jquery-1.8.2.min.js"></script>
  3. <script>
  4. $(document).ready(function () {
  5. $('#DictionaryEntryId').change(function () {
  6. $('#ChosenValue').text($('#DictionaryEntryId option:selected').val());
  7. });
  8. });
  9. </script>
  10. }

另外还有一点需要提到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相关文章