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日
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:控制器解析语法错误,转换日期以符合模型接口,而模型根据收到的日期值处理逻辑错误
由于控制器第一次接收到传入数据,因此可以使用传入数据+相关错误信息自由更新视图,而不仅仅是源于模型的数据。基本上有两种方法: