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:

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&gt ;.在页面上,它看起来像这样< 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相关文章