我有一个带有 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/