Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/crystal-reports/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model view controller MVC如何处理缺失的数据需求_Model View Controller - Fatal编程技术网

Model view controller MVC如何处理缺失的数据需求

Model view controller MVC如何处理缺失的数据需求,model-view-controller,Model View Controller,我在自学MVC概念,希望将它们应用到非OO/过程开发环境中。我很确定我理解简单的视图->请求->控制器->请求->模型->响应->控制器->响应->视图流 我正在努力理解更复杂的场景。例如,假设我有一个购物车表单,上面有一个“计算运费”按钮。通常,点击此按钮将遵循上述流程。但是如果缺少数据,比如邮政编码,该怎么办?视图是否应首先验证这一点,并在发出“计算装运”请求之前提醒用户?或者应该发出请求,并且模型返回关键数据丢失的通知?如果是后者,控制器是否指示视图提醒用户?如果我想在弹出式输入显示中提示

我在自学MVC概念,希望将它们应用到非OO/过程开发环境中。我很确定我理解简单的视图->请求->控制器->请求->模型->响应->控制器->响应->视图流

我正在努力理解更复杂的场景。例如,假设我有一个购物车表单,上面有一个“计算运费”按钮。通常,点击此按钮将遵循上述流程。但是如果缺少数据,比如邮政编码,该怎么办?视图是否应首先验证这一点,并在发出“计算装运”请求之前提醒用户?或者应该发出请求,并且模型返回关键数据丢失的通知?如果是后者,控制器是否指示视图提醒用户?如果我想在弹出式输入显示中提示用户输入丢失的邮政编码,然后再次自动请求“Calculate Shipping”方法,该怎么办


我想这就涉及到一个观点应该有多明智的问题。MVC似乎是由于更丰富的UI和自动化(如数据绑定)而发展起来的,这从纯MVC的角度来说是浑水。非常感谢您的任何想法。

您可以做五件事:

使用Javascript或jQuery在浏览器的客户端验证邮政编码 向服务器发送Ajax请求以验证邮政编码,并让控制器将验证结果返回到浏览器,或 发布整个页面,对其进行验证,如果邮政编码丢失,则将带有错误指示的同一页面返回给用户。
提醒:页面发布后,您仍然需要在服务器上再次验证数据。永远不要相信来自网页的数据,即使它已经在客户端进行了验证。

我自己的想法是,为了提高效率,应该尽可能多地在视图中进行操作,只要不涉及数据

换句话说,只要您确定数据模型永远不允许非数字,视图就可以检查是否缺少zipcode或非数字zipcode

但是,当您决定检查数据时,例如zipcode是否对美国大陆有效?应该参考数据模型本身

我见过这样的情况:视图是用一系列正则表达式创建的,用于预验证,每个字段一个,这样就不会给其他层带来不必要的负担。这意味着输入的数据在传回以进行更完整的验证之前至少通过了第一层健全性检查


另外,在提到检查用户输入的内容时,不要在用户文档中使用术语“健全性检查”。您可能会认为这是一个无辜的短语,但用户并不总是这么认为:-

虽然我有点含糊不清,但我看到我的示例给人的印象是这是一个“web”应用程序。事实上,这是一个传统的桌面GUI应用程序。然而,我对MVC的兴趣在于,我可以设计应用程序,使其易于插入其他视图(如网页)。为此,我很欣赏使用客户端逻辑(如Javascript)消除服务器请求开销的想法。我担心这会违反MVC。例如,视图真的应该知道邮递费需要一个邮政编码,还是应该由模型告诉它?视图必须知道邮政编码才能显示它。所以验证客户端只是扩展了这些知识。陷阱是你必须做两次;一次用于web页面,一次用于GUI,因为您不能在GUI中运行Javascript,也不能在web页面中运行GUI中使用的任何语言。但在这两种情况下,视图将显示相同的数据模型。这就是关注点分离的地方。很好。你是对的:Javascript不会帮助我的GUI,反之亦然。因此,我必须为这两种类型的视图重写客户端逻辑。但是,如果我依赖于模型,那么核心逻辑仍保留在一个位置,并且我的所有视图都可能相对“愚蠢”,即需要较少的重写来模拟相同的功能。是的,确实如此。因此,归根结底,这取决于您希望视图的智能程度。理论上,视图可以只是数据的模板,而不是其他。在实践中,视图有时比这更聪明,特别是对于需要比哑视图更精细的网页。您对何时依赖模型进行zipcode验证的区分很有趣。假设我确实想对模型进行zipcode验证检查。这是我的“计算运费”方法的责任还是单独的方法?如果是单独的方法,控制器是否先调用该方法,然后进行适当的路由,即如果zipcode无效,则返回到视图,或者如果zipcode有效,则返回到“Calculate Shipping”方法?如果您的CalcShipping方法需要zipcode,则vali 我相信最好是把它变成其中的一部分。我已经在一个视图上看到了通用验证,可以做到这一点,但我可以设想由您的视图调用的其他方法,这些方法不需要zipcode。理论上,视图会通知控制器执行CalcShipping,然后视图会根据结果进行更新。但是,与所有准则一样,许多人为了效率而忽视了它们:-