Model view controller MVC-谁设置模型的格式?

Model view controller MVC-谁设置模型的格式?,model-view-controller,Model View Controller,在渲染到视图模型之前,应设置以下格式: 多语言数据本地化 格式化日期、时间值 格式化的数字 谁执行所有这些格式化-控制器还是视图 所有格式化都是由控制器执行的,该控制器创建只包含格式化值的所谓ViewModel并将此ViewModel发送到视图,对吗 提前谢谢 所有这些东西看起来都像是表示层逻辑,所以我个人认为应该放在视图中 预计到达时间: 我不主张让视图调用一般意义上的服务层对象,但对于本地化,我认为这是有意义的 例如,假设页面上有大量静态文本,这些文本已标记并以各种本地化形式存储在数据库中。

在渲染到视图模型之前,应设置以下格式:

  • 多语言数据本地化
  • 格式化日期、时间值
  • 格式化的数字
  • 谁执行所有这些格式化-控制器还是视图

    所有格式化都是由控制器执行的,该控制器创建只包含格式化值的所谓ViewModel并将此ViewModel发送到视图,对吗


    提前谢谢

    所有这些东西看起来都像是表示层逻辑,所以我个人认为应该放在视图中

    预计到达时间:

    我不主张让视图调用一般意义上的服务层对象,但对于本地化,我认为这是有意义的


    例如,假设页面上有大量静态文本,这些文本已标记并以各种本地化形式存储在数据库中。我认为控制器必须查找并在模型中放置所有这些文本标记是没有意义的。尽管文本标记查找在技术上是一种“服务层”操作,但我仍然认为视图直接通过某个实用程序类调用该服务,而不是让控制器来调用该服务是有意义的。

    Eric Petroleje是对的,但我会构建一个类来获取本地化的内容/日期等,因为本地化并不总是在视图中,例如发送包含本地化内容的电子邮件。我会有类似LocalizationHelper.GetString(“MyKey”)或LocalizationHelper.GetDate(Date.Now)的东西,LocalizationHelper知道用户当前的语言环境(可能来自会话)

    然后尽可能在视图中直接使用此选项:

    <%= Html.Encode(LocalisationHelper.GetDate(Date.Now)) %>
    

    视图对此负责而不是控制器

    为了解释,我需要详细说明“视图”是什么:

    在基于web和传统的GUI MVC模式中,视图负责显示模型的任何部分的外部表示。如果这意味着从模型中“格式化”数据,那么就这样吧

    控制器不应该格式化数据-因为控制器负责根据来自外部世界的事件/命令对模型进行操作。控制器与渲染输出无关

    示例:

    我想显示一个包含多个订单行的购物车:

    • 向购物车添加物品会导致控制器更改购物车模型中的内容
    • 更改我的区域设置会导致控制器更改用户模型中的设置以指示首选区域设置
    • 无论何时显示购物车,视图都必须向模型询问订单行,并决定如何显示该订单行—可能是进行区域设置敏感的工作
    • 同一客户可以要求查看多种不同货币的购物车。这只意味着改变它在视图中的外观。它仍然是同一个顾客的同一个购物车,里面有同样的东西
    • 如果这是一个由web模板页面制作的web应用程序,您可能会嵌入代码以拉入本地化消息,例如
      。在这种情况下,“message_renderer”和模板文件都是视图的一部分
    视图不一定只是基于web的模板。例如,在一些基于Java的框架中,我们将“视图对象”放入velocity模板中。这些视图对象链接回模型中的对象,但它们也执行按需渲染和格式化行为。这些是视图的一部分,尽管它们不仅仅是一个模板


    对于ruby on rails和groovy on grails这样的框架来说,这有点让人困惑,因为它们将模板称为“视图”,而视图实际上不仅仅是一个模板。传统上(在Smalltalk MVC和Java的Swing中)视图只是可以执行格式化、渲染和任何其他显示相关行为的代码。

    设计模式101。

    型号用于存储数据(通常是数据库支持的)

    视图用于显示数据(而不是操纵数据)

    控制器用于操纵模型并将其传递给视图(例如,选择正确的区域设置将显示在此处)

    MVC不一定意味着您有3个不同的类,而是3个组件或层。这些都是抽象的,不一定要绑定到一个物理类。在控制器层中,它可以由任意数量的帮助器类或任何东西组成

    我同意卡通福克斯所说的,一切都是相互交织的。例如,如果您为购物车开发了一个视图,但是该模型包含生日信息,那么它将不起作用。它只是一种帮助消除重复工作的设计模式。当你有更少的变量和更少的噪音时,就更容易专注于需要做的事情,并且很好地理解它

    我与我们的团队讨论了如何使用注释在网页上呈现表单。这些注释放置在模型或实体类中。您通常直接使用实体类,因此如果将注释放在这里,就可以消除相当多的开销和重复工作。因为您的注释直接放置在模型类上,所以最终无法获得生日信息的视图,这是不可能的。此外,通过遵循模式,您可以去除那些不会为最终结果增加价值的垃圾。您只需编写业务逻辑,几乎没有其他内容

    尽管注释与模型层在同一个类中,但表示层或视图层由注释和辅助类组成。它不一定是不同的类或边界

    另一个例子是。我过去曾在一些PHPWeb“应用程序”上工作过。我使用应用程序是因为它们是一个整体代码块,或多或少是一个单一的mai