处理视图和模型之间多个请求的最佳MVC方式

时间:2013-02-13 09:10:42

标签: asp.net-mvc vb.net model-view-controller design-patterns

我有一个.net应用程序,其中包含表单层数据库模型层(实体框架)和控制器层层。

我需要处理这种情况:

  1. 用户按下按钮编辑某些参数

  2. 表单需要请求一些表示这些参数的当前状态的数据库

    • 可能会拒绝用户请求,因为N / A是当前情况,在这种情况下应显示错误消息框
  3. 显示模态表单,用户更改参数并确认

  4. 在数据库模型中进行了更改

  5. 这很简单。

    事实是,在第4点,我们需要在第2点处已经处理过的数据

    特别是:

    • 在第2点,我们向数据库模型请求了一些数据,该数据可能在缓存中,因此执行SQL查询
    • 该数据由本地LINQ处理
    • 返回以模态形式显示的几个复选框的状态

    • 在第4点,我们需要再次使用LINQ处理数据

    • 由于我们来自Form层,因此我们不再拥有该数据
    • 因此再次向DB模型请求数据,但这次是在缓存中
    • 本地LINQ再次处理数据

    是否值得重新加载和重新处理数据以维护MVC模式?

2 个答案:

答案 0 :(得分:3)

我不知道它在VB.NET中是如何工作的,但如果我们以纯粹的“MVC”方式看待这个问题(至少,我是如何理解的),那就是不对。

  1. 在此步骤中,单击完成后,表单将调用控制器(控制器将执行所有操作)
  2. 然后控制器需要进行验证。如果它需要数据库来做到这一点,那就这样吧。然后,它将用户重定向到视图。 (它应该是一个消息框还是其他表格来输入数据)
  3. 此处,用户在表单中进行更改,然后单击按钮进行提交。在此按钮中,您再次调用控制器(另一个功能/操作)。
  4. 在控制器中,您可以执行所需的验证,并通过LINQ在数据库中插入/更新数据。然后,您可以重定向到视图。
  5. 由于在步骤2和步骤4之间可能已经过了很多时间并且数据可能在2次调用之间发生了变化,我认为执行2次请求是可以的。此外,由于它们在控制器中是两个不同的功能,我认为你没有选择。

    我就是这样看的,但我错了:)

    修改

    我不知道对数据库的查询是耗时的并且这是一个问题。如果绝对的目标是不让用户等待两次,因为在这个应用程序中时间很重要,我想你可以存储您在内存中的第2步获得的对象,并使用控制器检索它(使用某种辅助类)。这就像在数据库中进行查询,但在内存中。如果你使用repository pattern,那么编码控制器中逻辑的程序员甚至不知道他在查询除数据库之外的东西,因为它是另一个抽象层次。您可以在第4步之后立即释放内存。

答案 1 :(得分:0)

哦,我不是百分百确定,但问题中的流量模式看起来不正确?

通常的程序是显示数据,并在那里有一个带有数据视图的编辑按钮

所以你可能有像

这样的东西
Function ShowAddressDetails(OwnerId as long) as ActionResult

你的ActionResult通常是一个要传递给VIEW的MODEL 也许(保持地址记录样本)像......

Return View(AddressRecordModel)

使用OwnerId参数

从SQL DB中提取地址记录

在您的VIEW中,您的EDIT按钮位于 你有至少两个选择, 那些

1. Reload data from SQL (used where data may have changed since last action)
2. Pass the already loaded Model (Used where the data hasnt changed)

这意味着你有以下任何一个(或两个)

Function EditAddressDetails(OwnerId as long) as ActionResult

Function EditAddressDetails(Model as AddressRecordModel) as ActionResult

或者你可能有“CHILDACTION”而不是“ACTION”的

另外请不要忘记以下内容...... 在HTTP GET请求中,模型从CONTROLLER传递到VIEW 在HTTP POST请求中,Model从VIEW传递到CONTROLLER 那你应该确实有模型(数据)?

最后,如果序列仅由ONE用户使用,则数据不应在请求之间发生变化,UNLESS和EDIT / AMEND / UPDATE请求成功完成。