如果MVC是“关注分离”,那么为什么要引入Razor语法?


22

我的问题与Microsoft引入的MVC设计模式和Razor语法有关。

在学习MVC设计模式时,我被告知该想法是基于称为关注点分离的原理。

但是Razor语法允许我们直接在Views中使用C#。

这不是问题的交集吗?


7
值得一提的是,ASP.NET MVC实际上并未实现MVC设计模式。MVC指示通过视图观察模型是否有更改,而ASP.NET MVC显然不是这种情况。
本杰明·格林鲍姆

11
如果您更改了对视图的看法,这也可能会有所帮助。视图不是客户端代码。它们是服务器端模板,在处理时会生成客户端html。作为服务器端代码,那里完全可以接受C#代码。
埃里克·金

6
@EricKing除外,其中允许任意代码的模板系统始终会通过阻力最小的路径导致不良设计,可怕的分层违反和不可维护性。不幸的是,似乎每个社区都必须自己学习。
霍布斯

12
@hobbs哇,好。根据我的经验。当然并非总是如此,并且(当然)程序员需要承担一些专业责任。我不怪工具。
埃里克·金

7
@BenjaminGruenbaum这些天来,在管理相互依赖性的方式上,是否还不像每个“ MVC”框架都一样?到现在为止,谈论“唯一的真正的MVC风格”已经不再有效,但是对于在ModelsViewsControllers中合理划分责任的任何系统使用术语一词更为实用,但是这些是相互依赖的吗?
亚历克斯

Answers:


66

您正在将Razor语法与关注点分离混合在一起。

关注点的分离与代码的结构方式有关。

能够在视图中使用C#并不能防止这种情况。它与关注点分离无关

当然,您可以在视图中构造代码以不遵循关注点分离,但是仅用于显示目的的C#代码又如何呢?那会住在哪里?


1
但是C#是服务器端语言吗?
约翰·史卓斯基

6
@约翰-是吗?如果您需要格式化日期以进行显示(并且显示总是表示客户端),那么您将在哪里格式化日期?该模型?控制器?都不行 您将在视图中这样做。
Oded 2014年

16
@John-因此,您的日期存储在数据库中,您可以通过模型/控制器将其传递到视图。您需要在其中添加HTML,因此您将以某种方式将其输出到JS进行格式化,而不是直接使用C#进行格式化?为什么?为什么这样更好?或者更确切地说,这种方法如何将关注点分离?
Oded 2014年

25
@ NPSF3000-语言不是“服务器端”或“客户端”。那是架构上的分离-可能是一种语言实现(JavaScript是服务器端或客户端语言-请记住node.js)。
奥德2014年

14
@FreeAsInBeer-这是属于客户端的一种逻辑-法国某人想查看与美国某人不同的日期(和货币/数字)格式。客户将“最清楚”如何显示这些内容。这是表示逻辑,因此属于视图。
Oded 2014年

35

我的回答不是直接回答问题,而是质疑问题中的假设。也就是说,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的答案是正确的。


2
是的,不加评论地投票。我修改了答案,以明确表示我正在质疑原始问题中的假设。如我所见,该问题不能直接回答,因为它有一个无效的前提。
艾隆2014年

出于好奇,是否为ASP MVC考虑过其他模板引擎?
2014年

2
@NWard当时有许多用于ASP.NET MVC的第三方视图引擎,但我们并不认为它们太强。我们认为Razor更容易理解(HTML是HTML,C#是C#),并且在ASP.NET Web Pages项目中也变得更好。
艾隆2014年

1
@Alex哦,我当然不能称赞Razor的全部,但我感谢您的评论!
2014年

1
@ateri片刻之后,它是答案左上方的大数字。
2014年

9

您将“技术分离”与“关注分离”混淆了。MVC的“视图”部分背后的基本思想是,“视图”中的代码不直接执行任何数据访问或繁琐的逻辑,而是分别留给“模型”和“控制器”部分。“控制器”将转换数据,执行任何必要的逻辑,然后将其路由到正确的“视图”。该视图也可以进行数据转换,但是我倾向于使它们保持纯净的外观,例如上面提到的日期转换。


这似乎并没有提供任何关于先前答案中提出和解释的要点的实质内容,尤其是这一点
gnat 2014年

4
+1以简洁明了的方式阐述,并且与以前的答案的解释重点不同。
亚历克斯

@gnat我只是想弄清楚他的困惑所在,然后快速解释关注点分离原理如何应用于MVC设计模式。也许我应该花更多的时间在“关注分离”的意义上?
whoisthemachine 2014年

0

我可以想到一个完美的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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.