Model view controller 视图如何显示非';模型中的t?

Model view controller 视图如何显示非';模型中的t?,model-view-controller,language-agnostic,design-patterns,Model View Controller,Language Agnostic,Design Patterns,我面临的问题是视图显示不在模型中的数据,而模型包含不在视图中的数据 假设数据模型有一个出生日期字段: DateTime: BirthDate; 该视图允许用户输入出生日期: 出生日期:1973年11月28日 这个日期通过控制器进入模型,一切都正常 但是文本进入文本框的方式并不是一下子的,首先用户键入一个“1”: 出生日期:1 我无法将“1”解析为任何类型的有效日期。控制器可以对这一轮事件作出反应,例如: 它可以单独保留模型中现有的出生日期 它可以将其设置为某种形式的“空” 但现在我们遇到

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

假设数据模型有一个出生日期字段:

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

出生日期:1973年11月28日

这个日期通过控制器进入模型,一切都正常


但是文本进入文本框的方式并不是一下子的,首先用户键入一个“1”:

出生日期:1

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

  • 它可以单独保留模型中现有的出生日期
  • 它可以将其设置为某种形式的“空”
但现在我们遇到了一个问题,因为视图显示:

  • “1”
但该模型包含

  • 1973年11月28日
模型包含的内容与视图显示的内容之间存在脱节

视图应该表示模型中的内容,但它没有。相反,它显示存储在TextBox.text属性中的文本。如何协调显示模型所包含内容的视图与显示其实际需要的内容的视图之间的断开关系

我需要把这个值存储在某个地方。我不能将“1”放在文本框的
Text
属性中,并且它不能存储在模型中。怎么办


如果用户输入了错误怎么办:

出生日期:z

视图显示:

  • “z”
但该模型包含

  • 1973年11月28日

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

出生日期:6天前

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

  • “6天前”
而该模型包含:

3/11/2010
  • 2010年11月3日

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

出生日期:水星在第七宫

我不知道如何把这变成一个约会,我真的不打算尝试。我只想告诉用户像正常人一样输入日期。但问题是:如何显示用户键入的文本

视图控制器用于显示模型中的内容。在这种情况下,模型不包含“mercury在第七宫”-它不能:出生日期的模型是一个
DateTime
,它不能容纳此字符串

当用户尝试点击save,我检查出生日期是否有效时,我将(正确地)查看模型,其中包含:

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



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

正如您所说,控制器可以访问视图,但实际上您只使用它从模型检索数据

用控制器生成的数据填充来自控制器的视图是完全有效的,特别是在传入数据的验证过程中

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

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

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

在您的例子中,“6天前”是一个值,与日期视图字段(字段是包含字符串“6天前”的容器的真正面向视图的语义)相关

3个选项供您选择:

  • 拥有智能模型和普通控制器,如果值与模型日期摄取方法不兼容,模型负责向控制器返回“无效值”返回代码
  • 拥有一个智能控制器&平凡的模型,让控制器完成所有的解析
  • 相对智能控制器和相对智能模型(最佳选择)。每一个都在一个特定的语义域中起作用。ie:控制器解析语法错误,转换日期以符合模型接口,而模型根据收到的日期值处理逻辑错误
在所有错误情况下,控制器负责用数据填充视图,无论数据来自模型还是控制器的解析


由于控制器第一次接收到传入数据,因此可以使用传入数据+相关错误信息自由更新视图,而不仅仅是源于模型的数据。

基本上有两种方法:

  • 提交的数据通常已在视图范围内的某个位置可用。例如,在Web应用程序中,它通常仍然可用作请求参数。只需检查它的存在并在视图中相应地显示即可

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