1的顾虑
的SoC在MVC分离不是关于从UI分离的业务逻辑。更重要的是,它给控制器主要功能:
- 从域模型填写视图模型;
- 来处理查看活动;
- 根据域逻辑显示视图。
视图仅负责MVC中的数据表示。
它使测试作为控制器经营纯视图模型类,而不是其经营活动和形式的WebForms非常简单。
In WebForms 查看处理所有UI活动,它基本上做出有关场景流的决定。
在这里,我想提一提,中View Model和Domain Model方面是不同的。 域名模式是一个描述所有服务的术语,业务逻辑和DAL隐藏于控制器与一些外观。并且查看模型是封装了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控制器Edit
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及其合作伙伴ntrols。它会导致严重的硬读测试,这对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)
我觉得这种说法是大约控制器的测试VS 代码隐藏。我在中报道过。
4号的ViewState和回发事件
ViewBag和ViewData的是弱类型的设施,通过控制器和视图之间的数据。它们呈现为元素,与ViewState无关。例如,在我的视图中,我初始化了ViewBag.Title = "EditView";
,它允许我在布局页面上使用这个字符串:<title>@ViewBag.Title - My ASP.NET MVC Application</title>
。在网页上,它看起来就像这样<title>EditView - My ASP.NET MVC Application</title>
至于TempData的,会话和应用程序,它们存储在服务器端。它根本不呈现在页面上。
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设计时考虑回传,他们决定你的基本应用模式。但是,也有不同的用于ASP.NET的UI工具包可以使应用程序更具动态性,并且仍然有一些适用于JQuery的地方。
哇,这是一个很长的答案。希望它会有所帮助。
您能否提供这些语句的来源?其中一些在没有背景的情况下颇具争议。 –
@d_z:http://stackoverflow.com/questions/102558/biggest-advantage-to-using-asp-net-mvc-vs-web-forms请参阅cvs的回答 – Smack
@d_z:你也可以参考http ://msdn.microsoft.com/en-us/library/dd381412%28v=vs.108%29.aspx – Smack