【问题标题】:AngularJS - generating view from .NET controller only executed onceAngularJS - 从.NET控制器生成视图只执行一次
【发布时间】:2016-02-29 07:55:41
【问题描述】:

我有一个带有 AngularJS 的 MVC .NET 应用程序。在我的路由提供程序中,我使用 mvc 的控制器来检索视图,如下所示:

   .when('/Units', {
        templateUrl: 'Unit/Units'
    })
    .when('/UnitsDetail', {
        templateUrl: 'Unit/UnitsDetail'
    })

而我的 .NET UnitController 有以下方法:

 [Authorize]
    public ActionResult Units()
    {
        return View();
    }

    [Authorize]
    public ActionResult UnitsDetail()
    {
        ViewBag.reference = Guid.NewGuid().ToString().Substring(0, 6);
        return View();
    }

对于 UnitsDetail 视图,我需要在 UnitsDetail() 方法中生成的引用。

当我多次从 Units 转到 UnitsDetail 时,问题就出现了。第一次调用 UnitsDetail() 方法并因此生成引用,但如果我返回 Units 并再次访问 UnitsDetail,则不会调用该方法并且引用是相同的。我需要每次生成一个引用。

我知道我可以在客户端使用 JS 生成它,或者从 Angular 向服务器发出 AJAX 请求,但我真正想知道的是如何让 Angular 在每次我转到“#/”时调用方法 UnitsDetail()单位详情”。

谢谢!

【问题讨论】:

  • 这只是一个疯狂的猜测,但它会不会是一些激进的浏览器缓存?
  • 也许 Angular 只生成一次页面,其余时间只显示第一页。我在不同的浏览器中尝试过,它们都做同样的事情,但是我还没有找到任何关于如何防止这种情况发生的信息。
  • 我正在尝试继续使用 ng-route 而不是 ui-route,而我看到的解决方案似乎只是使用 ui-route 来处理缓存。 ng-route有什么方法吗?谢谢
  • 对不起,我对 Angular 的了解很浅,所以很抱歉帮不了你。

标签: javascript c# angularjs asp.net-mvc asp.net-mvc-5


【解决方案1】:

默认情况下,Angular 会将所有视图缓存在其模板缓存中。

这是设计使然。

Angular 期望视图只是静态 HTML,动态部分使用 {{ dynamicScopeVariable }} 代码标记。 Angular 将使用范围对象来替换动态位。但是静态部分会从缓存中显示出来。

第一次执行视图时,视图被缓存。

这里有 2 个选项。实际上,从您的设计角度来看,这只是一个很好的 #2。

选项#1

在 Angular 中禁用模板缓存,如下所示 https://stackoverflow.com/a/27432167/2794980

这意味着 Angular 每次需要视图时都会调用 HTML ACTION。

这不是使用 angualar 的最佳方式,但它会起作用。您还应该考虑性能方面。到目前为止,ASP.NET MVC 应用程序上最耗时的调用是 Actions 调用。这种方法意味着,当您使用客户端 MVC 框架时,您并没有利用它的重要优点之一。

选项 #2

使用角度服务从后端获取 GUID。即下面的代码。

 ViewBag.reference = Guid.NewGuid().ToString().Substring(0, 6);

如果可以的话,最好使用 WebAPI(您的请求会很小)。使用 Angular 替换 VIEW 中的 GUID。

不清楚为什么需要 GUID 以及是否可以使用 Javascript 生成随机唯一编号的问题。如果这是可能的,它可能是最好的解决方案。但根据问题中的信息,您可以使用选项 1 或 2。

编辑:没有意识到您已经尝试过选项 2,在这种情况下是选项 1。

编辑2:如果你想从缓存中删除单个元素,你可以这样做

 $templateCache.remove("<Element Name>");

或者你可以使用

$cacheFactory.remove("Name")

在此处阅读有关缓存工厂的更多信息: https://docs.angularjs.org/api/ng/service/$cacheFactory

名称一般为页面名称,可以在调试器控制台查看模板缓存或缓存工厂对象找到准确的名称。

【讨论】:

  • 感谢@Pratik 我目前正在使用选项#2。我以引用变量为例,我想知道是否可以确保调用 Action 方法。这就是选项 #1 有用的原因,但是我知道这必须应用于整个应用程序。是否可以仅为这条路线禁用 Angular 缓存?或者是否可以从缓存中删除此视图的 html?再次感谢!
  • @davidivad :更新了评论以显示您可以做什么。
  • 非常感谢您的帮助!我将尝试使用选项 #2,因为它是最合适的选项,但了解其他选项也很好。
  • @davidivad 很高兴为您提供帮助 :)
猜你喜欢
  • 2013-07-22
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 2014-06-05
  • 2019-01-03
  • 2016-04-09
相关资源
最近更新 更多