C# 在ASP.net MVC中,我可以在完成控制器操作之前通过cshtml逻辑进行处理吗?
我有一个控制器,它的数据库逻辑发生在控制器操作中。此外,我知道这可能并不理想,但我有一些逻辑发生在我的观点。这会执行一些sql查询,这些查询可能会更新记录。我有一个在控制器操作开始时打开的事务。为了解决这个问题,我将它保留到我的操作的View()调用之后,希望在我提交事务之前视图逻辑能够执行。但是,这似乎不起作用,因为它似乎只在控制器的操作完全完成后处理视图逻辑C# 在ASP.net MVC中,我可以在完成控制器操作之前通过cshtml逻辑进行处理吗?,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我有一个控制器,它的数据库逻辑发生在控制器操作中。此外,我知道这可能并不理想,但我有一些逻辑发生在我的观点。这会执行一些sql查询,这些查询可能会更新记录。我有一个在控制器操作开始时打开的事务。为了解决这个问题,我将它保留到我的操作的View()调用之后,希望在我提交事务之前视图逻辑能够执行。但是,这似乎不起作用,因为它似乎只在控制器的操作完全完成后处理视图逻辑 ViewBag.Message = message; ViewBag.Test = test;
ViewBag.Message = message;
ViewBag.Test = test;
var result = View();
LegacyDataManager.Commit();
Data.Commit();
return result;
}
finally
{
LegacyDataManager.Stop();
Data.CloseInstance();
}
另一种解决方案是,在视图逻辑结束之前,我推迟执行事务的关闭,但这似乎比我目前正在尝试的更加错误
我的最终目标是在我关闭事务之前发生所有必要的逻辑
谢谢
在ASP.net MVC中,我可以在完成控制器操作之前通过cshtml逻辑进行处理吗
没有
控制流是控制器执行其逻辑,然后在完成并准备渲染视图时将控制传递给视图
听起来问题的根源在于你的观点有太多的逻辑性。例如:
这会执行一些sql查询,这些查询可能会更新记录
从某种角度来看,这绝对不应该发生。视图仅渲染结果,仅此而已。其中唯一的逻辑是根据模型的状态有条件地以不同的方式呈现视图。在渲染视图之外,它不应有副作用
当前的设计从根本上讲是有缺陷的,最好的办法是纠正应用程序的设计,而不是强迫框架符合您的设计
在ASP.net MVC中,我可以在完成控制器操作之前通过cshtml逻辑进行处理吗
没有
控制流是控制器执行其逻辑,然后在完成并准备渲染视图时将控制传递给视图
听起来问题的根源在于你的观点有太多的逻辑性。例如:
这会执行一些sql查询,这些查询可能会更新记录
从某种角度来看,这绝对不应该发生。视图仅渲染结果,仅此而已。其中唯一的逻辑是根据模型的状态有条件地以不同的方式呈现视图。在渲染视图之外,它不应有副作用
当前的设计存在根本性缺陷,您最好的选择是纠正应用程序的设计,而不是试图强制框架符合您的设计。在构建视图时,执行已离开控制器。“这可能不理想”-视图中有数据库逻辑是MVC应用程序中最大的设计缺陷之一。在构建视图时,执行已经离开控制器。“这可能不理想”-视图中有数据库逻辑是MVC应用程序中最大的设计缺陷之一。我理解并同意这一点。但我有一个问题:在我将所有逻辑移到控制器之后,仍然有可能发生错误。在构建视图时,可能在for循环中索引的值为1。在那一点上如何回滚?在我看来,我想回滚,因为用户可能会按refresh,我不希望逻辑再次执行。但我也希望视图能够渲染。我的担心有意义吗?或者你可能知道我遗漏了一个替代方案吗?@misterbee180:当你渲染视图时,没有什么可以“回滚”的了。操作已执行,结果已返回。视图仅向用户显示该结果。在显示结果时可能会发生错误(例如关于返回记录的错误假设,导致使用无效索引或空引用异常),但是,在控制器中执行的操作已经成功执行。因此,如果是这种情况,我现在是否需要编写逻辑来检查特定步骤是否尚未发生,如果是,则在不可避免地按下刷新时不执行操作?这似乎是一个可能的安全措施,但如果这也是一个错误的方法,我最好不要这样做。@misterbee180:你问的不太清楚。这听起来像是你在思考问题,而且可能比问题中提到的更依赖于你观点中的逻辑。控制器动作执行操作,视图显示结果。就这么简单。也许你可以举一个不适合那个模具的例子,我的控制器正在更新很多东西。目前的想法是,如果你来到这个页面,执行逻辑并显示结果。所以我关心的是在查看过程中发生了一个错误,用户按下刷新,现在控制器逻辑再次启动,开始构建、更新东西,等等。除非我完全重新编写数据库存储东西的方式,否则目前无法知道已经执行了工作。我明白这一点并同意。但我有一个问题:在我将所有逻辑移到控制器之后,仍然有可能发生错误。在构建视图时,可能在for循环中索引的值为1。在那一点上如何回滚?在我看来,我想回滚,因为用户可能会按refresh,我不希望逻辑再次执行。但我也希望视图能够渲染。我的担心有意义吗?或者你可能知道我遗漏了一个替代方案吗?@misterbee180:当你渲染视图时,没有什么可以“回滚”的了。操作已执行,结果已返回。竞争对手