我面临的问题是视图显示不在模型中的数据,以及包含不在视图中的数据的模型。
想象一下,数据模型有一个出生日期字段:
DateTime: BirthDate;
该视图允许用户输入出生日期:
出生日期: 1972年11月28日
那个日期通过控制器进入模型,一切都与世界一致。
但是文本进入TextBox的方式不是立即进行的,首先用户输入“ 1 ”:
出生日期: 1
我无法将“1”解析为任何有效日期。控制器可以对这一事件发生反应,例如:
但现在我们遇到了问题,因为视图显示:
但模型包含
我们在模型包含的内容与视图显示的内容之间存在脱节。
视图应该代表模型中的内容,但事实并非如此。相反,它显示的文本存储在TextBox.Text属性中。如何协调显示模型所包含内容的视图与显示实际需要的视图之间的脱节?
我需要将此值存储在某处。我不能将“ 1 ”放在TextBox的Text
属性中,并且它不能存储在模型中。怎么办?
如果用户输入错字怎么办:
出生日期: z
视图显示:
但模型包含
当视图与数据模型完全不同时,事情变得更加复杂:
出生日期: 6天前
我的控制器可以解析此字符串并将其转换为日期,例如3/11/2010。控制器将日期3/11/2010存储在模型中。但现在我们在视图和模型之间存在差异。该视图显示:
虽然模型包含:
用户可以输入我无法识别的其他日期:
出生日期:水银在第7宫
我不知道如何把它变成一个约会,我真的不会尝试。我只是告诉用户输入像普通人一样的日期。但问题是:我如何显示他们输入的用户文字?
控制器使用视图来显示模型中的内容。在这种情况下,模型不包含“汞在第7宫” - 它不能:出生日期的模型是DateTime
,它不能保存此字符串。
当用户尝试点击保存时,我检查 BirthDate 是否有效,我将(正确)查看模型,其中包含:
3/11/2010
并假设用户输入了正确的日期。除了他们没有。
答案 0 :(得分:1)
我认为你没有充分利用你的控制器。
Controller可以按照您的说法访问视图,但实际上您只能使用它来从模型中检索数据。
用控制器发起的数据填充控制器的视图是完全有效的,特别是在传入数据的验证过程中。
在您的情况下,模型仍然可以负责接受从控制器预先解析的数据。
模型的功能范围可能从哑/数据存储到具有参数验证方法的智能实体。
控制器具有角色作为视图和视图之间的语义边界。模型。 视图数据可以用面向视图的语义表达,模型有自己的语义(如日期格式)
在您的情况下,“6天前”是一个值,与日期视图字段相关(字段是容纳字符串“6天前”的容器的真实视图导向语义)
3个选项:
在所有错误情况下,控制器负责用数据填充视图,无论它们来自模型还是控制器的解析。
由于控制器首先收到传入数据,因此可以使用传入数据+相关错误信息更新视图,而不仅仅是模型原始数据。
答案 1 :(得分:1)
基本上有两种方式:
提交的数据通常已在视图范围内的某处提供。例如,在Web应用程序中,它通常仍可用作请求参数。只需检查其存在并在视图中相应显示。
在额外的抽象层中获取初始值和提交的值。当提交的值无错误地转换和验证时,更新初始值并删除提交的值,以便视图知道要显示的值。大多数基于组件的MVC框架(如Sun JSF和MS ASP.NET MVC)都是这样工作的。