深入理解MVC.net中的延迟加载和错误处理

2024-02-19

我试图对以下问题写出完整详细的答案:为什么“Dispose”有效,而不是“using(var db = new DataContext())”? https://stackoverflow.com/questions/23110719/why-does-dispose-work-and-not-usingvar-db-new-datacontext

所以我建立了我的项目,其中包括:

使用实体框架的部门和员工

所以我的行动方法是这样的:

public ActionResult Index()
    {

        IEnumerable<department> d;
        using (var ctx = new ApplicationDbContext())
        {

            d = ctx.departments;

        }


        return View(d);
}

很自然地预期这会导致常见错误:

The operation cannot be completed because the DbContext has been disposed

当我想解决它时,我执行了以下操作[强制急切加载而不是轻松加载]:

 public ActionResult Index()
    {

        IEnumerable<department> d;
        using (var ctx = new ApplicationDbContext())
        {

            d = ctx.departments.toList();

        }


        return View(d);
}

所以我试图了解幕后的事情并查看 View() 方法的返回类型。我达到了以下目的'Correct' 假设:

1-模型 [d] 在 using 语句中以延迟加载方式调用。

2-因此,当模型 [d] 发送到视图以生成页面时,DbContext 已由 using 语句的最后一个大括号处理。

3-我们通过使用急切加载方式将模型 [d] 发送到视图来解决这种情况。

然后我继续我的假设,事实证明是'wrong'如下:

4-由于 View() 方法返回 ViewResult 对象,它也是一个 ActionResult ..那么我可以在 using 语句中生成该对象,然后将其返回给用户。

所以我做了以下事情:

public ActionResult Index()
    {

        ActionResult myView;

        using (var ctx = new ApplicationDbContext())
        {

            IEnumerable<department> d = ctx.departments;

            myView =  View(d);

        }


        return myView;
    }

所以我现在告诉自己,当我运行它时,ViewResult 对象 [ myView] 将已经创建并将返回给用户,并且不会遇到错误。

然而,令我惊讶的是,同样的错误发生了:

The operation cannot be completed because the DbContext has been disposed

我很惊讶这种延迟加载真的很懒并且只在最后一刻加载。

所以我继续我的'wrong'假设如下:

5-可能我需要强制 View() 方法在 using 语句内执行结果。所以我用了这个方法ExecuteResult(ControllerContext).

现在我想我可以运行操作方法而不会出现任何错误 但同样的错误又发生了:

The operation cannot be completed because the DbContext has been disposed.

所以我现在的问题是:

MVC 框架中的哪个位置执行延迟加载查询?

或者让我将我的问题改写如下:

Why did View(d)当 [d] 对象位于 using 语句之外时,方法会迭代该对象,而当 view(d) 方法位于 using 语句内部时,则不会迭代该对象。

我只需要了解为什么我的假设是错误的.. 提前致谢


好的。我找到了一个非常有说服力的答案,如下:

我开始阅读有关 MVC5 生命周期的内容,并在网上找到了很多文章。其中之一是以下链接:http://www.dotnet-tricks.com/Tutorial/mvc/TbR0041112-Asp.net-MVC-Request-Life-Cycle.html http://www.dotnet-tricks.com/Tutorial/mvc/TbR0041112-Asp.net-MVC-Request-Life-Cycle.html所以我复制了图片并添加了我的评论,如下所示[礼貌:www.dotnet-tricks.com]

然后我在另一篇文章中读到[这里:http://www.codemag.com/Article/1312081] http://www.codemag.com/Article/1312081%5D,如何将视图渲染为字符串并将其作为操作方法的返回类型返回。这样我就可以在 using 语句内使用延迟加载并渲染视图。

所以我所做的就是对我的操作方法进行以下更改[解释作为评论包含在内]

 // GET: /dept/
    public string  Index()
    {

        IView myView;
        string result;
        using (var ctx = new ApplicationDbContext())
        {
            //my model brought using the dbContext
            IEnumerable<department> d = ctx.departments;

            // now because I want to render the View here [forcibly] and not waiting
            //for the normal MVC pipeline to render my View I had to jump to the ViewEngine
            //and ask it to render my View [while i am still inside this using statement]
            // so referring to the excellent article on :http://www.codemag.com/Article/1312081
            //I did the following:
            ControllerContext.Controller.ViewData.Model = d;
            ViewEngineResult viewEngResult = ViewEngines.Engines.FindView(ControllerContext, "~/Views/dept/Index.cshtml", null);

            myView = viewEngResult.View;
            //till this point the View is not rendered yet
            StringWriter tw = new StringWriter();// used to render the View into string
            ViewContext vc = new ViewContext(ControllerContext, myView, ControllerContext.Controller.ViewData, ControllerContext.Controller.TempData, tw);
            //it is the following method .Render(viewContext, textWriter) that will start iterating on the IEnumerable<department> object
            myView.Render(vc, tw);

            result = tw.ToString();// the rendered View is now written as string to the result
            tw.Dispose();
        }

        return result;
    }
}

我很高兴看到我的页面成功呈现,没有出现那个著名的处理错误;查看结果:


总结一下:

我的问题的答案是:

当您从操作方法返回 ViewResult 或 ActionResult 时;视图仍未呈现。一旦它到达 ViewEngine 的管道,并且 ViewEngine 触发方法 .Render(),此时延迟加载对象将需要 dbContext,并会导致著名的 dbContext 处置错误。 我还展示了如何在操作方法本身内渲染视图。甚至在 dbContext 的 using 语句中;我可以避免这个处理错误。

谢谢大家:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解MVC.net中的延迟加载和错误处理 的相关文章

随机推荐

  • 执行 2 个位图的重叠检测

    我有一个自定义图片框控件 允许在主图像上单独拖动 2 个位图 从而允许用户选择 2 个位图的位置 对于第一个位图 Point src e Location PointF ratio new PointF float src X Client
  • Express.js:app.locals vs res.locals vs req.session

    我试图了解何时最好使用以下各项 这是我的初步理解 应用程序 locals 适合在应用程序级别存储全局变量 所有用户 会话都会看到这些变量的相同值 这些变量可用于所有视图 当地人资源 适合存储特定请求 响应周期的变量 这些变量仅适用于与响应关
  • equals方法在字符串和列表中的使用

    在oracle java文档中 list 中的 equals 表示如果两个列表包含相同的元素 则它们被定义为相等 但从对象类 equals 仅当它们的哈希码相等时才返回 true 这意味着列表中的 equals 覆盖对象类中的 equals
  • Salesforce .net API 集成

    我有点困惑 我们从 Salesforce 下载了 WSDL 文件 并使用建议的文件路径创建了对其的 Web 引用 它创建了我所理解的代理类 但不是 SforceService 类 其他人建议您必须使用 WSDL exe 生成类文件 我这样做
  • 如何在Golang中打印切片的内存地址?

    我有一些 C 经验 而且对 golang 完全陌生 func learnArraySlice intarr 5 int 12 34 55 66 43 slice intarr fmt Printf the len is d and cap
  • Tomcat:无法解析运行时描述符

    我尝试在 CentOS 6 3 gt Apache gt Tomcat 5 5 下部署 JAX WS webservice 我用谷歌搜索了几个小时 询问了我所有的朋友 还尝试在 stackoverflow 上找到解决方案 但无济于事 有人可
  • void_t 和带有 decltype 的尾随返回类型:它们完全可以互换吗?

    考虑以下基于的基本示例void t template
  • 如何淡出一张图像并淡入另一张图像(Java)?

    我想让它在一个图像淡出时 另一个图像淡入 我有两个BufferedImages我正在使用 AWT Edit package com cgp buildtown import java awt BorderLayout import java
  • Python - Py2exe 无法使用“电子邮件”模块构建 .exe

    py2exe 不适用于标准电子邮件模块 你好 我正在尝试使用 py2exe 将脚本转换为 exe 构建过程显示了这一点 似乎缺少以下模块 email Encoders email Generator email Iterators emai
  • React SPA 中的 msal - 使用从 AcquireTokenRedirect 收到的访问令牌

    我有一个 React SPA 并且正在使用 msal 通过 loginRedirect 对 Microsoft 用户进行身份验证 登录后 我使用 acquireTokenSilent 静默获取访问令牌来调用 Web API 当获取访问令牌失
  • 在 android 中将一个视图放置/重叠(z-index)在另一个视图之上

    我有一个线性布局 由 imageview 和 textview 组成 在线性布局中一个在另一个下面
  • 我可以在 Intranet 中访问 ASP.NET 开发服务器吗?

    我正在测试 ASP NEt 站点 当我执行它时 它会启动 ASP NET 开发服务器并打开一个页面 现在我想在我拥有的内网中测试它 我可以使用这台服务器吗 或者我需要在这台机器上配置 IIS 我需要配置一些东西才能让它工作吗 我已将 loc
  • 如何使用位图将图像分享到社交媒体?

    我需要从 RecyclerAdapter 共享图像 因为该图像最初并不存在 即使用适配器在 Activity 中加载 如何将位图分享到社交媒体 每次我在应用程序中单击共享时 都会显示 没有应用程序可以执行此操作 feedItemView s
  • 删除 ToolStripControlHost 周围的空白

    我正在尝试删除 toolstripcontrolhost 控件周围的空白 该控件在上下文菜单中托管日历控件 请参阅附图和代码 VB Dim menuItem As ToolStripMenuItem New ToolStripMenuIte
  • 在 VBA-Selenium 中按 Enter 和向下键

    我想在 vba selenium 中编写一段代码以按 Enter 和向下箭头键 所以你可以帮助我吗 我已经尝试过下面的代码 但它不起作用 selenium keyDownNative 40 For Down Arrow key seleni
  • 如何在Azure VM上推出最新的.net框架?

    我使用 azure 门户创建了一个 Azure VM windows sever 2016 它安装了 net 4 6 2 现在我想在其上推出最新的可用 net 框架 4 7 4 7 1 一种选择是下载所需的框架并将其安装在虚拟机上 我确信应
  • 子进程的 waitpid 未成功

    我正在使用启动一个进程execv并让它写入文件 我同时启动一个线程来监视文件 以便它的大小不超过使用的特定限制stat st size 现在 当达到极限时 我waitpid对于子进程 但这会引发错误 并且我在后台启动的进程变成僵尸进程 当我
  • 同一个表上的内连接和左连接

    我有两个表 A 和 B 其中有两列 x 和 y 我想在 x 上内连接 A 和 B 但只保留 A 列 y 的值 左连接 我正在寻找一种组合两个 y 列的方法 不能只在 select 语句中指定 A y 我怎样才能做到这一点 Example T
  • Knockout.js:更新绑定?

    当我在 ko applyBindings 之后将任何新元素注入 DOM 时被调用 那么淘汰赛将无法识别这些新元素 我可以理解为什么会发生这种情况 它们只是没有被淘汰索引 因此 起初我认为在添加新元素后再次调用 ko applyBinding
  • 深入理解MVC.net中的延迟加载和错误处理

    我试图对以下问题写出完整详细的答案 为什么 Dispose 有效 而不是 using var db new DataContext https stackoverflow com questions 23110719 why does di