代码之家  ›  专栏  ›  技术社区  ›  Ian Boyd

视图如何显示不在模型中的数据?

  •  0
  • Ian Boyd  · 技术社区  · 14 年前

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

    假设数据模型有 出生日期 领域:

    DateTime: BirthDate;
    

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

    出生日期: 11/28/1973

    这个日期通过控制器输入到模型中,一切正常。


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

    出生日期:

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

    • 它可以将现有的出生日期单独留在模型中
    • 它可以设置为某种形式的“空”

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

    • “1”

    但模型包含

    • 11/28/1973

    我们在模型所包含的内容和视图所显示的内容之间断开了连接。

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

    我需要把这个值储存在某个地方。我不能离开 “坐在文本框里 Text 属性,它不能存储在模型中。怎么办?


    如果用户输入错误:

    出生日期: Z

    视图显示:

    • “Z”

    但模型包含

    • 11/28/1973

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

    出生日期: 6天前

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

    • “6天前”

    而模型包含:

    • 3/11/2010

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

    出生日期: 水星在第七宫

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

    这个 看法 控制器 显示 模型 . 在这种情况下,模型不包含“ 水星在第七宫 “-不能:出生日期的模型是 DateTime 不能容纳这个字符串。

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

    3/11/2010
    

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


    2 回复  |  直到 13 年前
        1
  •  1
  •   dweeves    14 年前

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

    controller可以访问您所说的视图,但实际上您只使用它从模型中检索数据。

    从控制器中填充来自控制器的数据是完全有效的,特别是在传入数据的验证过程中。

    在您的情况下,模型仍然有责任接受从控制器预分析的数据。

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

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

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

    为您提供3种选择:

    • 具有智能模型和普通控制器的模型负责在值与模型日期摄取方法不兼容时向控制器返回“无效值”返回代码。
    • 拥有一个智能控制器和简单的模型,让控制器完成所有的解析
    • 相对智能的控制器和相对智能的模型(最佳选择)。每一个都在特定的语义场中起作用。ie:控制器解析语法错误,转换日期以符合模型接口,而模型根据接收到的日期值处理逻辑错误。

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

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

        2
  •  1
  •   BalusC    14 年前

    基本上有两种方法:

    1. 提交的数据通常已经在视图范围内的某个地方可用。例如,在webapplication中,它通常仍然可用作请求参数。只需检查它的存在并相应地显示在视图中。

    2. 在一个额外的抽象层中获得初始值和提交值。当提交的值无错误地转换和验证时,更新初始值并删除提交的值,以便视图知道要显示哪个值。大多数基于组件的mvc框架,比如sun jsf和ms asp.netmvc,都是这样工作的。