AngularJS - 从.NET控制器生成视图只执行一次

时间:2015-11-26 09:32:07

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

我有一个使用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() UnitsDetail”。

谢谢!

1 个答案:

答案 0 :(得分: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

使用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/ $ cacheFactory

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