2010-09-14 30 views
9

我从Model(包含数据的数组)中获取数据,我需要以特定格式显示。我需要迭代数组,格式化数据然后显示它。我应该在哪里格式化数据以显示?在模型,控制器还是视图? 谢谢。MVC:我应该在哪里格式化数据?

+0

如你所愿。但在控制器中更好。 – pltvs 2010-09-14 12:16:14

+0

@Alexander不是控制者的责任。 – Gordon 2010-09-14 12:21:53

+1

@我在控制器中做这件事...... – jared 2010-09-14 12:38:07

回答

5

对数组进行迭代并显示数据在视图中完成。因此我也会在视图中进行格式化。如果格式化复杂和/或需要大量代码,请将其置于辅助函数中。

例如:

查看:

<?php foreach($array as $item): ?> 
    <p><?php echo format_function($item); ?></p> 
<?php endforeach; ?> 

助手:

function format_function($text) 
{ 
    // Do some formatting here... 
    return $formatted_text; 
} 
+0

帮手功能听起来不错:) – jared 2010-09-14 12:38:46

+4

不要用这样的废话污染你的看法。该视图不负责格式。尝试使用负责将对象模型格式化/转换为视图友好视图模型的独立图层:)就像Stefanvds在.NET中说的那样,存在一个名为AutoMapper的对象映射器,也许在php中有一个等价物。 – Rookian 2010-09-14 15:09:41

+0

我不同意。我所知道的每个MVC框架都具有开箱即用的支持。如果不是这样的情况下,那么我应该用什么帮手?你的解决方案可能更“纯粹”,但在这种简单的情况下,我觉得增加另一层过度。 – Mischa 2010-09-14 15:59:11

2

如果你的可视数据有来自不同模型的数据,或者只有1个模型的选择部分,你可以制作一个ViewModel,然后您可以使用Automapper进行映射。

ViewModels有几个优点。他们都清楚的工作,unclutter您的数据,可以增加安全性,...

+0

与该模式的详细信息的任何链接? – Gordon 2010-09-14 12:21:07

+0

@戈登:http://en.wikipedia.org/wiki/View_model? – fabrik 2010-09-14 12:23:17

+0

@fabrik有关其他用途,请参见[查看模型(消歧)](http://en.wikipedia.org/wiki/View_model_%28disambiguation%29)。在引用模式时从不伤害链接。 – Gordon 2010-09-14 12:27:26

2

可以在模型 做到在View.Not在View你可以做具体的操作(转换/环境/)

2

如果你在一个更大的项目上工作,我会建议你有一个额外的层或类负责将你的对象(即域模型对象)转换为数据传输对象(视图模型对象)。

否则申请做格式化视图:)

的转化可以用格式化字符串,小数(货币),日期时间等参与的建议。 也可以将一个对象图(看看我的示例)转换为平面DTO。

控制器将负责调用映射算法。

所以在视图中,您不必遍历对象的引用。相反,你使用一个平坦的格式化视图模型。

你的看法不会混乱起来,看起来很干净。

.NET世界中提供了一个可以执行此转换作业的工具。它被称为AutoMapper。也许在PHP中有一个等价物。

下面是一个例子

这是一个对象模型: alt text

你可以将它转换成智能浏览模式:

alt text

这种方法的好处方法:

  • 分离 - 的顾虑

  • 清洁视图

  • 无代码的重复,即,格式化在每个视图中的日期时间。 (不要重复自己!)

的这种方法的缺点:

  • 贵为开端,这么少的项目不会从这种做法中获利
1

待办事项它在您的视图中,因为它负责演示。

原因

  • 没有这样做的模型,然后可以使用相同的数据呈现不同的看法(否则你需要创建不同的数据集),
  • 控制器不这样做是因为它不是控制器的责任

MVC background reading

2

介绍!=数据格式。请考虑以下示例:

国际商店有一个产品页面,其中包含有关产品尺寸的各种信息等。由于商店的国际性质,这些数据的格式应针对访问商店的每个地区而不同。例如:在欧洲,测量值显示为度量值,而美国客户则看到与英制值格式相同的数据。

一个重要的注意的是,数据的这种特殊类型不宜存放各种格式多次,但数据对于价格的例子应该。这是因为产品价格因地区而异。另一方面,测量和日期在不同地区是相同的;只有它们显示和格式化的方式不同。信息应该始终以尽可能少的冗余进行存储。

这样的商店(或任何基于MVC的应用程序,对于这个问题)的视图部分除了呈现数据并确定如何将数据呈现给用户之外不应该做任何其他事情。数据本身不应该被视图以任何方式改变。这就是为什么关于测量和时间的信息应该存储在ISO标准格式的中,这使格式化数据变得更容易。例如,度量值应作为度量值存储。从数据库中检索数据集之后,每个语言环境的实际数据格式应该在模型中进行,最好使用静态可访问的辅助类型类,以获得最大的灵活性。数据格式化后,它会返回到控制器,然后返回到当前视图。

的处理数据格式这种方式的另一个重要上攻,那是你的数据仍然会被格式正确,当你尝试通过View-少动获得的数据集(即通过AJAX检索的JSON对象)。以任何方式(通过“普通”HTML模板或JSON/XML字符串)发送回客户端的数据不应有所不同;只提供了

+0

同意。 SoC是关于责任的,并且通常在具有被动视图(如MVP变体,MVVM,MVPVM等)的呈现体系结构中,格式化/数据准备责任不是视图的责任。这将是演示者/视图模型,并且对于更多“MVP风格”的ASP.Net MVC而言,例如,控制器更好,也就是vm)。被动性增加了测试/重用,保持了演示逻辑。最后一段提出了一个我没有想到的重要观点,这也意味着“格式化”并不意味着格式化为观看。 – user1172173 2017-09-05 05:26:24

相关问题