Asp.net mvc 处理视图和模型之间的多个请求的最佳MVC方法

Asp.net mvc 处理视图和模型之间的多个请求的最佳MVC方法,asp.net-mvc,vb.net,model-view-controller,design-patterns,Asp.net Mvc,Vb.net,Model View Controller,Design Patterns,我有一个.net应用程序,在这两层之间有一个表单层、一个DB模型层(实体框架)和一个控制器层 我需要处理这种情况: 用户按下按钮编辑某些参数 表单需要请求一些表示这些参数当前状态的DB数据 用户请求可能会被拒绝,因为当前情况不适用,在这种情况下,应该显示一个错误消息框 此时会显示一个模式表单,用户更改参数并确认 在数据库模型中进行了更改 这很简单 事实上,在第4点,我们需要一些在第2点已经处理过的数据 特别是: 在第2点,我们向数据库模型请求一些数据,这些数据可能不在缓存中,因此执行SQL

我有一个.net应用程序,在这两层之间有一个表单层、一个DB模型层(实体框架)和一个控制器层

我需要处理这种情况:

  • 用户按下按钮编辑某些参数

  • 表单需要请求一些表示这些参数当前状态的DB数据

    • 用户请求可能会被拒绝,因为当前情况不适用,在这种情况下,应该显示一个错误消息框
  • 此时会显示一个模式表单,用户更改参数并确认

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

  • 这很简单

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

    特别是:

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

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

    • 因为我们来自表单层,所以我们不再有这些数据
    • 因此,数据再次被请求到DB模型,但这次它在缓存中
    • 该数据由本地LINQ再次处理

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

    我不知道它在VB.NET中到底是如何工作的,但如果我们用纯“MVC”的方式来看待这个问题(至少我是如何理解的),有些地方是不对的

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

    我就是这么看的,但我可能错了:)

    编辑


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

    哦,我不是100%确定,但您问题中的流程看起来不正确

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

    所以你可能有

    Function ShowAddressDetails(OwnerId as long) as ActionResult
    
    您的ActionResult通常是要传递给视图的模型 也许(与地址记录样本保持一致)类似于

    Return View(AddressRecordModel)
    
    其中,使用OwnerId参数从SQL DB提取地址记录

    在您的视图中,编辑按钮所在的位置, 你至少有两个选择, 那些

    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
    

    或者,您可以使用“CHILDACTION”而不是“ACTION”

    也不要忘记以下几点。。。 在HTTP GET请求中,模型从控制器传递到视图 在HTTP POST请求中,模型从视图传递到控制器 那么你真的应该拥有模型(数据)


    最后,如果序列仅由一个用户使用,则数据不应在请求之间更改,除非和编辑/修改/更新请求成功完成。

    场景有所不同。在步骤2中,我从数据库中检索一些数据。然后我对数据进行时间开销分析(不是真正的时间开销,只是说10秒,但我不会让用户等待两次),它给我一个结果对象,命名为
    dataResult
    ,我用它来检查弹出表单是否可以出现。稍后在步骤4,我需要再次计算在DB模型中写入的内容。这里的数据一致性不是问题,因为整个模型是事务驱动的,而且此软件必须一次由一个用户(管理员)使用。这已经在另一个软件中强制执行了。好吧,我不知道这个请求很耗时。如果您的绝对目标是不让用户等待两次,因为时间很重要,我想您可以将在步骤2中获得的对象存储在内存中,并使用控制器检索它。这就像在数据库中进行查询,但在内存中。这样,您就不会破坏MVC模型,而是从临时存储库而不是真正的数据库中检索数据。
    Function EditAddressDetails(Model as AddressRecordModel) as ActionResult