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 – SignalR(Hub)可以发送除信号制作者之外的消息吗
- asp.net – ASP.MVC CORE网站的最大上传大小
- asp.net – 在asp页面中显示来自其他站点的网页
- ASP.NET MVC捆绑缓存. (检测css文件更改)(内部行为)
- asp.net-mvc-3 – MVC 3 WebGrid – 可以进行内联编辑吗?
- 如何防止ASP.NET从缓存中删除项目
- asp.net-mvc – 将匿名对象从视图传递到部分视图
- asp.net – 即使在IIS的web.config中使用标签后,也会出现重
- ASP.NET网站或Web项目
- asp.net – Microsoft成员提供者与自定义提供者vs完成自定义
- asp.net-mvc – 使用AutoMapper的控制器上的单元
- 在ASP.NET中检测来自移动浏览器的请求
- asp.net – 避免使用CORS进行预检OPTIONS请求
- asp.net – WebAPI不返回XML,即使有正确的Accept
- asp.net-mvc-3 – ASP.NET MVC 3书籍计划
- asp.net – SignalR不能与.Net Core一起使用
- asp.net – 什么是Kestrel(vs IIS/Express)
- 具有Entity Framework Code Only和ASP.NET MVC的
- asp.net – 如何从Javascript调用控制器方法
- asp.net – 线程被中止
