我的问题与Microsoft引入的MVC设计模式和Razor语法有关。
在学习MVC设计模式时,我被告知该想法是基于称为关注点分离的原理。
但是Razor语法允许我们直接在Views中使用C#。
这不是问题的交集吗?
我的问题与Microsoft引入的MVC设计模式和Razor语法有关。
在学习MVC设计模式时,我被告知该想法是基于称为关注点分离的原理。
但是Razor语法允许我们直接在Views中使用C#。
这不是问题的交集吗?
Answers:
您正在将Razor语法与关注点分离混合在一起。
关注点的分离与代码的结构方式有关。
能够在视图中使用C#并不能防止这种情况。它与关注点分离无关。
当然,您可以在视图中构造代码以不遵循关注点分离,但是仅用于显示目的的C#代码又如何呢?那会住在哪里?
我的回答不是直接回答问题,而是质疑问题中的假设。也就是说,Razor是为MVC构建的假设是不正确的。我在Microsoft的ASP.NET团队中工作,并且对此有第一手的了解。
Razor最初并不是MVC的视图引擎。它是为ASP.NET Web Pages创建的,这可能是您在光谱中分离最少的方面。它是ASP.NET Web窗体/经典ASP以及现代许多其他类似服务器编程框架的替代品。Razor的想法是在HTML(标记)和C#(代码)之间创建几乎无缝的过渡。
直到后来,团队(包括我自己)才决定,Razor语法对于MVC的视图引擎才有意义,该引擎是由同一团队编写的。
关于Razor是否启用,阻碍,改进或更改ASP.NET MVC中关注点分离的概念,Oded的答案是正确的。
您将“技术分离”与“关注分离”混淆了。MVC的“视图”部分背后的基本思想是,“视图”中的代码不直接执行任何数据访问或繁琐的逻辑,而是分别留给“模型”和“控制器”部分。“控制器”将转换数据,执行任何必要的逻辑,然后将其路由到正确的“视图”。该视图也可以进行数据转换,但是我倾向于使它们保持纯净的外观,例如上面提到的日期转换。
我可以想到一个完美的Don't do it
例子。
假设我们有一个ProductController:
public class ProductController()
{
public ViewResult Discontinued()
{
var db = new ProductsDb();
var products = db.Products.Where(x => x.Discontinued).ToList();
return new ViewResult(products);
}
}
使用剃须刀,我们有另一种选择
public class ProductController()
{
public ViewResult Discontinued()
{
var db = new ProductsDb();
var products = db.Products.ToList();
return new ViewResult(products);
}
}
并且我们认为:
@model IEnumerable<Product>
@foreach (var item in Model.Where(x => x.Discontinued)) {
....
}
我认为第二种解决方案感觉很不对很明显。如果您做这样的事情,请不要怪剃刀-怪自己。
而且请不要忘记:能够在视图中使用C#并不是一个很重要的功能,ASP.NET视图也可以。有了剃须刀,它就更简单了。
如果您要搜索的模板引擎更像导轨,那么您应该使用超级简单视图引擎查看nancy.fx。