这是一个简单的问题:用户希望以类似网格的方式编辑产品:选择并单击添加,选择并单击添加...然后他们会看到更新的产品列表...然后单击“完成”并保存订单
但是,每个“添加”都有转到服务器,因为它涉及服务器端验证。此外,验证是在域实体内部(例如,订单) - 也就是说,为了进行验证,我需要调用order.Add(product)然后命令决定它是否可以添加产品。
问题是,如果我按订单添加产品,它会保留更改,所以即使用户没有点击“完成”,更改仍然会在那里!
好的,我可能不应该修改订单,直到用户点击完成。但是,如何验证产品呢?这应该由订单实体完成 - 如果产品已经添加,产品不与其他产品冲突等。
另一个问题是,我必须根据订单添加产品并根据其新状态“重建视图/ HTML”(因为它可以大大改变)。但是如果我不坚持订单更改,则下一次添加将从每次相同的订单开始,而不是从更新的订单开始。也就是说,我需要以某种方式跟踪订单的变化。
我看到了几个解决方案:
这个问题很常见吗?你是如何解决类似问题的?什么是最佳实践?
答案 0 :(得分:0)
这在很大程度上取决于您如何实现对象/验证,但您的选项5可能是最好的选择。如果AJAX不是你的事,你可以通过将已经添加但未保存的条目的相关数据写入隐藏字段来完成同样的事情。
换句话说,流程结束了这样的事情:
用户输入项目。
将项目发送到服务器并进行验证。返回视图,其中用户在隐藏字段中输入数据。
用户输入第二项。
将项目发送到服务器,并验证这两个项目。将返回视图,其中包含隐藏字段中两个项目的数据。
等。
到目前为止F5 / Refresh杀死输入的数据...根据我的经验,这不是太大的问题。一个更紧迫的问题是后退/前进按钮,需要使用像Really Simple History这样的东西进行管理。
如果您想在刷新后继续使页面继续工作,则需要执行以下操作之一:
这些是唯一可用的重定向和刷新存储位置。
答案 1 :(得分:0)
如果我是你,我会想出类似于选项5的东西。既然你说你对Ajax感到满意,你可以试试这个。但在此之前,您应将验证逻辑移到Order.Add()方法之外。也许你可以将它移动到另一个名为Validate()的公共函数,它返回一个bool。您仍然可以在Add()方法中调用相同的Validate(),从而在添加订单之前进行必要的验证。
现在,如果我对此有完整的发言权,那么无论何时添加/编辑产品,我都不会进行验证。我会在客户完成任务时进行验证。那将是最简单的解决方案。但是,也许我错过了一些东西。