视图如何显示模型中没有的数据?

时间:2010-03-17 15:57:06

标签: model-view-controller language-agnostic design-patterns

我面临的问题是视图显示不在模型中的数据,以及包含不在视图中的数据的模型。

想象一下,数据模型有一个出生日期字段:

DateTime: BirthDate;

该视图允许用户输入出生日期:

出生日期: 1972年11月28日

那个日期通过控制器进入模型,一切都与世界一致。


但是文本进入TextBox的方式不是立即进行的,首先用户输入“ 1 ”:

出生日期: 1

我无法将“1”解析为任何有效日期。控制器可以对这一事件发生反应,例如:

  • 它可以将现有的BirthDate留在模型中
  • 它可以将其设置为某种形式的“空”

但现在我们遇到了问题,因为视图显示:

  • “1”

但模型包含

  • 1973年11月28日

我们在模型包含的内容与视图显示的内容之间存在脱节。

视图应该代表模型中的内容,但事实并非如此。相反,它显示的文本存储在TextBox.Text属性中。如何协调显示模型所包含内容的视图与显示实际需要的视图之间的脱节?

我需要将此值存储在某处。我不能将“ 1 ”放在TextBox的Text属性中,并且它不能存储在模型中。怎么办?


如果用户输入错字怎么办:

出生日期: z

视图显示:

  • “Z”

但模型包含

  • 1973年11月28日

当视图与数据模型完全不同时,事情变得更加复杂:

出生日期: 6天前

我的控制器可以解析此字符串并将其转换为日期,例如3/11/2010。控制器将日期3/11/2010存储在模型中。但现在我们在视图和模型之间存在差异。该视图显示:

  • “6天前”

虽然模型包含:

  • 3/11/2010

用户可以输入我无法识别的其他日期:

出生日期:水银在第7宫

我不知道如何把它变成一个约会,我真的不会尝试。我只是告诉用户输入像普通人一样的日期。但问题是:我如何显示他们输入的用户文字?

控制器使用视图来显示模型中的内容。在这种情况下,模型不包含“汞在第7宫” - 它不能:出生日期的模型是DateTime,它不能保存此字符串。

当用户尝试点击保存时,我检查 BirthDate 是否有效,我将(正确)查看模型,其中包含:

3/11/2010

并假设用户输入了正确的日期。除了他们没有。


2 个答案:

答案 0 :(得分:1)

我认为你没有充分利用你的控制器。

Controller可以按照您的说法访问视图,但实际上您只能使用它来从模型中检索数据。

用控制器发起的数据填充控制器的视图是完全有效的,特别是在传入数据的验证过程中。

在您的情况下,模型仍然可以负责接受从控制器预先解析的数据。

模型的功能范围可能从哑/数据存储到具有参数验证方法的智能实体。

控制器具有角色作为视图和视图之间的语义边界。模型。 视图数据可以用面向视图的语义表达,模型有自己的语义(如日期格式)

在您的情况下,“6天前”是一个值,与日期视图字段相关(字段是容纳字符串“6天前”的容器的真实视图导向语义)

3个选项:

  • 拥有智能型号&简单的控制器,如果值与模型日期摄取方法不兼容,模型负责将“无效值”返回代码返回给控制器。
  • 拥有智能控制器&琐碎的模型,让控制器做所有的解析
  • 相对智能的控制器&相对聪明的模型(最佳选择)。每个都在特定的语义字段中起作用。即:控制器解析语法错误,转换日期以符合模型接口,而模型根据收到的日期值处理逻辑错误。

在所有错误情况下,控制器负责用数据填充视图,无论它们来自模型还是控制器的解析。

由于控制器首先收到传入数据,因此可以使用传入数据+相关错误信息更新视图,而不仅仅是模型原始数据。

答案 1 :(得分:1)

基本上有两种方式:

  1. 提交的数据通常已在视图范围内的某处提供。例如,在Web应用程序中,它通常仍可用作请求参数。只需检查其存在并在视图中相应显示。

  2. 在额外的抽象层中获取初始值和提交的值。当提交的值无错误地转换和验证时,更新初始值并删除提交的值,以便视图知道要显示的值。大多数基于组件的MVC框架(如Sun JSF和MS ASP.NET MVC)都是这样工作的。