javascript - AngularJS - 从 .NET Controller 生成 View 只执行一次

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

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

   .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 View ,我需要一个在 UnitsDetail() 方法中生成的引用。

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

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

谢谢!

最佳答案

默认情况下,angular 会将所有 View 缓存在其模板缓存中。

这是设计使然。

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

第一次执行 View 时, View 被缓存。

这里有 2 个选项。实际上,从您 #2 的设计 Angular 来看,这只是一个不错的选择。

选项#1

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

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

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

选项#2

使用 angualar 服务从后端获取 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/ $缓存工厂

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

关于javascript - AngularJS - 从 .NET Controller 生成 View 只执行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33934928/

相关文章:

javascript - 将半径 slider 添加到 Google map JavaScript API

javax 脚本如何从 Java 调用 JavaScript 中的函数

c# - 从 .NET 3 迁移到 .NET 5 时,Azure Function 中出现错误 "Did not find functions with language [dotnet-isolated]"

javascript - 我的未保存更改指令需要适用于所有具有不同名称的表单

javascript - AngularJS 拒绝成功回调中的 promise

javascript - 计算点击总和并追加总计?

javascript - 如何检测页面上的任何点击?

javascript - 切换 Angular css 类

c# - 转义和取消转义无效字符

c# - 如何在数据网格控件的每一行的开头添加复选框控件?